`

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

    博客分类:
  • C#
阅读更多

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

 

 

 

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

 

  • 大小: 17.2 KB
  • 大小: 15.7 KB
分享到:
评论

相关推荐

    ASP.Net 技术 SqlCommand对象示例 数据库安徽机电职业技术学院陈伟

    ASP.Net 技术 SqlCommand对象示例 数据库

    使用Sqlcommand执行SQL语句

    使用Sqlcommand执行SQL语句使用Sqlcommand执行SQL语句

    操作数据库(DataSet,DateAdapter,SqlCommand)

    连接数据库、关闭数据库 、执行查询(SqlCommand) 、执行增、删、改(SqlCommand)、执行查询(DataSet,DateAdapter)、执行查询(DataSet,DataTable)、执行查询( SqlCommand,SqlDataReader)

    SqlHelper源码及使用实例

    在 SqlCommand 对象能够被执行之前,所有参数都必须添加到 Parameters 集合中,并且必须正确设置 Connection、CommandType、CommandText 和 Transaction 属性。SqlHelper 类中的专用函数主要用于提供一种一致的方式...

    SqlCommand_ExecuteNonQuery方法

    SqlCommand_ExecuteNonQuery方法,亲自运行过,没有问题初学者参考

    SqlCommand_ExecuteScalar方法

    SqlCommand_ExecuteScalar方法,亲自运行过,没有问题初学者参考

    C# .net 是怎么使用 存储过程的

    C# .net 是怎么使用 存储过程的, 来几句简单明了的代码? 1.构造与Sql服务器连接对象 2.构造SqlCommand对象 3.指定SqlCommand对象调用的存储过程 4.声明SqlCommand对象的命令类型为存储过程

    MysqlDLL,C#操作MYSQL数据库

    参数集合 方法: ExecuteNonQuery(): 返回受影响函数,如增、删、改操作;  ExecuteScalar():执行查询,返回首行首列的结果;  ExecuteReader():返回一个数据流(SqlDataReader对象)。  实例1: ...

    C#访问SQL Server数据库的实现方法

    SqlConnection类用于建立与数据库的连接,SqlCommand类用于创建SQL命令,SqlDataReader对象是执行SqlCommand对象返回结果集的查询语句后的结果。 下面是部分代码: /*其中server表示服务器,“.”表示当地服务器,...

    C#-数据库知识点及连接数据库方法.docx

    2、连接字符串的写法 3、SqlConnection对象 4、SqlCommand对象 5、SqlDataReader对象 6、DataSet对象 7、释放资源 1、概述 ado.net提供了丰富的数据库操作,这些操作可以分为三个步骤: 第一,使用SqlConnection...

    ASP.NET程序设计:用户注册功能实现.ppt

    SqlCommand对象的属性 指定T-SQL命令作为SqlCommand对象的文本 SqlCommand cmd; cmd.Connection = sqlconn; cmd.CommandType = CommandType.Text; cmd.CommandText = "Select * from T_Ware"; 使用StordProcedure...

    c#连接数据库常用的语句

    private SqlCommand CreateCommand(string procName, SqlParameter[] prams) //将参数添加到SqlCommand当中 { this.Open();//确认打开连接 SqlCommand cmd = new SqlCommand(procName, con); cmd.CommandType =...

    SQLHelper.cs

    注意: ExecuteXmlReader 不支持连接字符串,因为:与 SqlDataReader 对象不同,XmlReader 对象在 XmlReader 关闭时没有提供自动关闭连接的方法。如果客户端传递了连接字符串,那么当客户端完成对 XmlReader 的操作...

    SqlCommand_Parameters

    SqlCommand_Parameters属性用法例子,亲自运行过,没有问题初学者参考

    .net数据访问类 SQL Helper 类

    在 SqlCommand 对象能够被执行之前,所有参数都必须添加到 Parameters 集合中,并且必须正确设置 Connection、CommandType、CommandText 和 Transaction 属性。SqlHelper 类中的专用函数主要用于提供一种一致的方式...

    c++中堆栈及创建对象示例代码

    主要给大家详细介绍了c++如何实现堆栈及创建对象,文中先进行了简单的介绍,而后给出了详细的示例代码及注释,相信对大家的理解和学习很有帮助,有需要的朋友们下面跟着小编一起来学习学习吧。

    C# winform调用SQL存储过程-菜鸟入门 详细注释

    内容概要:简单的C# winform调用存储过程实例,创建存储过程入参,通过SqlConnection对象和SqlCommand对象调用存储过程,获取存储过程的出参并显示出来,详细代码注释,希望对用到C#调用存储过程的小伙伴有帮助 ...

    ADO.NET 2.0技术内幕(高清 中文 带书签 全)

    4.1 在代码中使用SqlCommand对象 4.2 使用SqlDataReader 4.3 使用参数化查询 4.4 Microsoft Visual Studio设计时特性 4.5 SqlCommand,SqlDataReader和SqlParameter的对象参考 4.6 常见问题 第5章 用SqlDataAdapfer...

    asp.net小实例解析

    // 为存储过程添加参数信息 SqlParameter parameterBookID = new SqlParameter("@BookID", SqlDbType.Int, 4); parameterBookID.Value = bookID; myCommand.Parameters.Add(parameterBookID); Sql...

    ADO.NET 数据库连接的相关知识 Connect

    ADO.NET提供了多种对象模型,比较典型的以下有五种 一、SqlConnection对象 二、SqlCommand对象 三、SqlDataAdapter对象 四、DataTable对象 五、DataSet对象

Global site tag (gtag.js) - Google Analytics