向SqlCommand对象的ParameterCollections集合添加参数时犯的低级错误

今天写代码遇到了一个小小的问题看来是基础不过关啊,嘿嘿.

 

 

 

   上图中注释的几种向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]);
            }
        }
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值