none
这个“SQLCEHelper”类写的有什么问题吗??? RRS feed

  • 问题

  • 问题一:这个“SQLCEHelper”类写的有什么问题吗???   是不是有什么资源没有释放???      
    问题二: 跑在WinCE下是不是有什么需要优化的地方???
    public abstract class SqlCEHelper
        {
            public delegate void SqlErrorDescript(string strMsg);
            public static SqlErrorDescript sqlError;
            public static int ExecNonQuery(string connStr, string sqlStr)
            {
                int iRet;
                try
                {
                    using (SqlCeConnection conn = new SqlCeConnection(connStr))
                    {
                        conn.Open();
                        using (SqlCeCommand cmd = new SqlCeCommand(sqlStr, conn))
    问题三:外面有一个using了,这里的using是不是可以省略掉???
                        {
                            iRet = cmd.ExecuteNonQuery();
                        }
                        //conn.Close();
                    }
                }
                catch (Exception ex)
                {
                    if (sqlError != null)
                    {
                        sqlError("执行SQL指令错误\tSql语句:" + sqlStr + "\t错误信息:" + ex.Message + "\r\n");
                    }
                    iRet = -1;
                }
                return iRet;
            }

            public static int ExecNonQueryList(string connStr, List<string> sqlList)
            {
                int iRet = 0;
                try
                {
                    using (SqlCeConnection conn = new SqlCeConnection(connStr))
                    {
                        conn.Open();
                        SqlCeCommand cmd = new SqlCeCommand();
                        cmd.Connection = conn;
                        cmd.CommandType = CommandType.Text;
                        foreach (string sql in sqlList)
                        {
                            cmd.CommandText = sql;
                            try
                            {
                                cmd.ExecuteNonQuery();
                            }
                            catch (Exception ex)
                            {
                                if (sqlError != null)
                                {
                                    sqlError("执行SQL指令错误\tSql语句:" + sql + "\t错误信息:" + ex.Message + "\r\n");
                                }
                            }
                            iRet++;
                        }
                    }
                }
                catch (Exception ex)
                {
                    if (sqlError != null)
                    {
                        sqlError("执行SQL指令列表错误\t错误信息:" + ex.Message + "\r\n");
                    }
                    iRet = -1;
                }
                return iRet;
            }

          

    Science and technology is my lover.

    2014年8月12日 12:37

答案

  • Hello,

    >>问题一:这个“SQLCEHelper”类写的有什么问题吗???   是不是有什么资源没有释放???   

    一般来说你需要确保你的connection 对象和DataReader对象在使用完后能及时关闭就ok.

    >>  using (SqlCeCommand cmd = new SqlCeCommand(sqlStr, conn))

    问题三:外面有一个using了,这里的using是不是可以省略掉???

    这个可以省略。

    楼主你可以参考这个对SqlClient写的SQLHelp类, 比较全面的:

    http://www.cnblogs.com/liwuyi/archive/2012/05/16/2505461.html

    Regards.


    We are trying to better understand customer views on social support experience, so your participation in this interview project would be greatly appreciated if you have time. Thanks for helping make community forums a great place.
    Click HERE to participate the survey.

    2014年8月13日 5:47
    版主
  • 问题三:可以嵌套使用,也可以直接在一个using中处理,总而言之,为了防止异常,最好使用try……catch……finally……,而且在finally中直接调用连接数据库对象的Dispose或者Close方法关闭(两者任选其一)。

    问题四:需不需要事务看你任务的需要。如果你的任务需要多个子句完成,而且这些语句必须同时完成,或者任意一句失败就需要全部回滚,才使用事务。回到问题——如果你的List相互相关,必须一次性全部插入,只要有一个失败就全部失败。那必须使用事务。

    问题五:应该用using,这样可以自动释放变量:

    public static bool RepairDataBase(string connStr)
            {
              bool flag = false;
               using (SqlCeEngine engine = new SqlCeEngine(connStr))
               {
                            try
                           {
                              engine.Repair(null, RepairOption.RecoverCorruptedRows);
                             flag=true;
                           }
                           catch(Exception exp)
                          {
                            //处理异常
                          }
                          finally
                         {
                             engine.Close(); //或者Dispose()
                         }
                 return flag;
               }
            }

    ASP.NET Forum
    Other Discussion Forums
    FreeRice Donate
    Issues to report
    Free Tech Books Search and Download

    2014年8月16日 12:34

全部回复

  •   public static int ExecCommit(string connStr, List<string> sqlList)
            {
                int iNum = 0;
                try
                {
                    using (SqlCeConnection conn = new SqlCeConnection(connStr))
                    {
                  SqlCeTransaction Tran = null;
                        SqlCeCommand cmd = null;
                        conn.Open();
                        Tran = conn.BeginTransaction();
                        cmd = conn.CreateCommand();
                        cmd.CommandType = CommandType.Text;
    问题四:这里有必要用事务吗?  就是执行SQL序列?   事务是不是资源开销很大?
                    foreach (string s in sqlList)
                        {
                            try
                            {
                                cmd.CommandText = s;
                                cmd.ExecuteNonQuery();
                                iNum++;
                            }
                            catch (Exception ex)
                            {
                                if (sqlError != null)
                                {
                                    sqlError(ex.Message);
                                }
                            }
                        }
                        Tran.Commit(CommitMode.Immediate);
                    }
                }
                catch (Exception ex)
                {
                    if (sqlError != null)
                    {
                        sqlError("执行SQL指令事务\t错误信息:" + ex.Message + "\r\n");
                    }
                    return -1;
                }
                return iNum;
            }

            public static bool TableExists(string connStr, string strTable)
            {
                object obj = null;
                try
                {
                    using (SqlCeConnection conn = new SqlCeConnection(connStr))
                    {
                        conn.Open();
                        using (SqlCeCommand cmd = new SqlCeCommand("select * from information_schema.tables where table_name='" + strTable + "'", conn))
                        {
                            obj = cmd.ExecuteScalar();
                            if (obj == null)
                            {
                                return false;
                            }
                            else
                            {
                                return true;
                            }
                        }
                    }
                }
                catch
                {
                    return false;
                }
            }

            public static DataSet ExecReader(string connStr, string sqlStr)
            {
                DataSet ds = new DataSet();
                SqlCeDataAdapter sda;
                try
                {
                    using (SqlCeConnection conn = new SqlCeConnection(connStr))
                    {
                        conn.Open();
                        using (SqlCeCommand cmd = new SqlCeCommand(sqlStr, conn))
                        {
                            sda = new SqlCeDataAdapter(cmd);
                            sda.Fill(ds);
                        }
                        //conn.Close();
                    }
                }
                catch (Exception ex)
                {
                    if (sqlError != null)
                    {
                        sqlError("执行读取命令错误\tSql语句:" + sqlStr + "\t错误信息:" + ex.Message + "\r\n");
                    }
                    return null;
                }
                return ds;
            }


    Science and technology is my lover.

    2014年8月12日 12:38

  •         public static bool RepairDataBase(string connStr)
            {
                SqlCeEngine engine = new SqlCeEngine(connStr);

    问题五:这里需不需要用using???
                engine.Repair(null, RepairOption.RecoverCorruptedRows);


                return true;
            }

            public static bool CreateDataBase(string strDataBase)
            {
                if (File.Exists(strDataBase) == true)
                {
                    return false;
                }
                string strPath = strDataBase.Substring(0, strDataBase.LastIndexOf("\\"));
                if (Directory.Exists(strPath) == false)
                {
                    Directory.CreateDirectory(strPath);
                }
                if (Directory.Exists(strPath) == false)
                {
                    return false;
                }
                try
                {
                    SqlCeEngine engine = new SqlCeEngine("Data Source = " + strDataBase + ";password=tyeet;encrypt database=TRUE");
                    engine.CreateDatabase();
                }
                catch (Exception)
                {
                    return false;
                }

                return true;
            }
        }

    Science and technology is my lover.

    2014年8月12日 12:38
  • Hello,

    >>问题一:这个“SQLCEHelper”类写的有什么问题吗???   是不是有什么资源没有释放???   

    一般来说你需要确保你的connection 对象和DataReader对象在使用完后能及时关闭就ok.

    >>  using (SqlCeCommand cmd = new SqlCeCommand(sqlStr, conn))

    问题三:外面有一个using了,这里的using是不是可以省略掉???

    这个可以省略。

    楼主你可以参考这个对SqlClient写的SQLHelp类, 比较全面的:

    http://www.cnblogs.com/liwuyi/archive/2012/05/16/2505461.html

    Regards.


    We are trying to better understand customer views on social support experience, so your participation in this interview project would be greatly appreciated if you have time. Thanks for helping make community forums a great place.
    Click HERE to participate the survey.

    2014年8月13日 5:47
    版主
  • 问题三:可以嵌套使用,也可以直接在一个using中处理,总而言之,为了防止异常,最好使用try……catch……finally……,而且在finally中直接调用连接数据库对象的Dispose或者Close方法关闭(两者任选其一)。

    问题四:需不需要事务看你任务的需要。如果你的任务需要多个子句完成,而且这些语句必须同时完成,或者任意一句失败就需要全部回滚,才使用事务。回到问题——如果你的List相互相关,必须一次性全部插入,只要有一个失败就全部失败。那必须使用事务。

    问题五:应该用using,这样可以自动释放变量:

    public static bool RepairDataBase(string connStr)
            {
              bool flag = false;
               using (SqlCeEngine engine = new SqlCeEngine(connStr))
               {
                            try
                           {
                              engine.Repair(null, RepairOption.RecoverCorruptedRows);
                             flag=true;
                           }
                           catch(Exception exp)
                          {
                            //处理异常
                          }
                          finally
                         {
                             engine.Close(); //或者Dispose()
                         }
                 return flag;
               }
            }

    ASP.NET Forum
    Other Discussion Forums
    FreeRice Donate
    Issues to report
    Free Tech Books Search and Download

    2014年8月16日 12:34