如题,我利用ODBC.NET连接ACCESS数据库,由于业务需要生成动态SQL,下面是部分代码:
动态INSERT语句执行成功:insert into DLPoint (测点性质,附属设施,管线类别,管点编号,明显隐蔽点,参考埋深,X坐标,Y坐标,地面高程,GlobalID) values (?,?,?,?,?,?,?,?,?,?)动态UPDATE语句失败(不报错,但并没更新):
update JSLine set 起点埋深=?,材质=? where GlobalID='a059088d-b66f-4592-a56d-1f6dc8d280c7'生成动态SQL:
            
            StringBuilder format = new StringBuilder();
            foreach(DataGridViewRow dr in dgvSourceInfo.Rows)
            {
                if(dr.Cells["是否复制"].Value != null && (bool)dr.Cells["是否复制"].Value == true)
                {
                    string value = dr.Cells["字段内容"].Value.ToString();
                    if(value == "")
                        continue;
                    string field = dr.Cells["字段名称"].Value.ToString();
                    string type = dr.Cells["数据类型"].Value.ToString();                    format = format.Append(field + "=?" + ",");
                    switch(type) {
                        case "Byte":
                        case "String":
                            cmd.Parameters.AddWithValue("@" + field, value);
                            break;
                        case "Single":
                        case "Double":
                            cmd.Parameters.AddWithValue("@" + field, Convert.ToDouble(value));
                            break;
                        case "Int16":
                        case "Int32":
                            cmd.Parameters.AddWithValue("@" + field, Convert.ToInt32(value));
                            break;
                        case "DateTime":
                            cmd.Parameters.AddWithValue("@" + field, Convert.ToDateTime(value).ToShortDateString());
                            break;
                    }
                }
            }
补充一下,上述生成SQL是指UPDATE语句,
接上面代码:  
            format = format.Remove(format.Length - 1, 1);
            foreach(string[] str in xDataInfo)
            {
                cmd.CommandText = string.Format("update {0} set {1} where GlobalID='{2}'", str[0], format,  str[1]);
                cmd.ExecuteNonQuery();
            }

解决方案 »

  1.   

    封装成存储过程方式:  /// <summary>
            /// 执行存储过程
            /// </summary>
            /// <param name="storedProcName">存储过程名</param>
            /// <param name="parameters">存储过程参数</param>
            /// <returns>结果中第一行第一列</returns>
            public static string RunProc(string storedProcName, IDataParameter[] parameters)
            {
                using (SqlConnection connection = new SqlConnection(connectionString))
                {
                    string StrValue;
                    connection.Open();
                    SqlCommand cmd;
                    cmd = BuildQueryCommand(connection, storedProcName, parameters);
                    StrValue = cmd.ExecuteScalar().ToString();
                    connection.Close();
                    return StrValue;
                }
            }
    执行sql方式       /// <summary>
            /// 执行多条带参数的SQL语句,实现数据库事务
            /// </summary>
            /// <param name="sqlList">SQL语句的HASH表,执行对象为Hashtable表,Key为SQL语句,Value为SQL参数列表 SQLParameter[]对象</param>
            public static void ExecuteSqlTran(Hashtable sqlList)
            {
                using (SqlConnection conn = new SqlConnection(connectionString))
                {
                    conn.Open();
                    using (SqlTransaction trans = conn.BeginTransaction())
                    {
                        SqlCommand cmd = new SqlCommand();
                        try
                        {
                            foreach (DictionaryEntry item in sqlList)
                            {
                                string cmdText = item.Key.ToString();
                                SqlParameter[] cmdParms = (SqlParameter[])item.Value;
                                PrepareCommand(cmd, conn, trans, cmdText, cmdParms);
                                int rows = cmd.ExecuteNonQuery();
                                cmd.Parameters.Clear();
                                trans.Commit();
                            }
                        }
                        catch (SqlException ex)
                        {
                            trans.Rollback();
                            throw new Exception(ex.Message);
                        }
                    }
                }
            }
    你检查下,哪儿有问题?
      

  2.   

    人家是ACCESS.
    而且根本不是什么动态语句,而是程序根据条件拼接语句.