今天写代码遇到了一个小小的问题看来是基础不过关啊,嘿嘿.
上图中注释的几种向ParameterCollection集合添加参数的方式程序都能正确执行, 并能成功的向数据库添加数据
为什么只有comm.Parameters.Add("@password",SqlDbType.VarChar,50,password);
这种方式向ParameterCollection集合添加参数会报异常呢,很是不解..
查了下MSDN才明白原来是我理解错误啦,罪过啊........
问题已经很明显了。
SqlCommand.Parameters.Add(String, SqlDbType, Int32, String)
这个方法的最后一个参数,设置的是SqlParameter.SourceColumn属性,而不是SqlParameter.Value属性,所以SqlParameter.Value的值一直保持为null,在执行自然会报错了。
我理解错了,我一直把该方法最后一个参数的源列的名称理解成传入的参数值,实际上这里指的是数据库中的列名.
MSDN:
public sealed class SqlParameter { ... // // 摘要: // 获取或设置源列的名称,该源列映射到 System.Data.DataSet 并用于加载或返回 System.Data.SqlClient.SqlParameter.Value // // 返回结果: // 映射到 System.Data.DataSet 的源列的名称。默认值为 Null字符串。 public override string SourceColumn { get; set; } ... }
MSDN:
http://msdn.microsoft.com/zh-cn/library/33y2221y.aspx
下面的示例演示如何通过显式设置 DataAdapter 的 UpdateCommand 并调用其 Update 方法对已修改行的执行更新。 请注意,在 UPDATE 语句的 WHERE 子句中指定的参数设置为使用 SourceColumn 的 Original 值。 这一点很重要,因为 Current 值可能已被修改,可能会不匹配数据源中的值。 Original 值是用于从数据源填充 DataTable 的值。 private static void AdapterUpdate(string connectionString) { using (SqlConnection connection = new SqlConnection(connectionString)) { SqlDataAdapter dataAdpater = new SqlDataAdapter( "SELECT CategoryID, CategoryName FROM Categories", connection); dataAdpater.UpdateCommand = new SqlCommand( "UPDATE Categories SET CategoryName = @CategoryName " + "WHERE CategoryID = @CategoryID", connection); dataAdpater.UpdateCommand.Parameters.Add( "@CategoryName", SqlDbType.NVarChar, 15, "CategoryName"); SqlParameter parameter = dataAdpater.UpdateCommand.Parameters.Add( "@CategoryID", SqlDbType.Int); parameter.SourceColumn = "CategoryID"; parameter.SourceVersion = DataRowVersion.Original; DataTable categoryTable = new DataTable(); dataAdpater.Fill(categoryTable); DataRow categoryRow = categoryTable.Rows[0]; categoryRow["CategoryName"] = "New Beverages"; dataAdpater.Update(categoryTable); Console.WriteLine("Rows after update."); foreach (DataRow row in categoryTable.Rows) { { Console.WriteLine("{0}: {1}", row[0], row[1]); } } } }