`

向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对象示例 数据库安徽机电职业技术学院陈伟

    创建SqlCommand对象时,通常需要提供两个主要参数:一个是连接到数据库的SqlConnection对象,另一个是要执行的SQL命令字符串。例如: ```csharp string connectionString = "Data Source=myServerAddress;Initial ...

    使用Sqlcommand执行SQL语句

    `SqlParameter`类用于创建参数,可以将它们添加到`SqlCommand`的`Parameters`集合中。例如: ```csharp string searchKey = "keyword"; SqlCommand command = new SqlCommand("SELECT * FROM TableName WHERE ...

    SqlCommand_Parameters

    2. **添加参数**:使用SqlCommand对象的Parameters集合,我们可以添加SqlParameter对象。参数通常以“@”符号开头,这在SQL命令文本和SqlParameter对象中都是如此。例如,添加一个名为@CustomerID的参数: ```...

    SqlCommand_ExecuteNonQuery方法

    然后,创建一个SqlCommand对象,并将SqlConnection对象作为参数传递,这样SqlCommand就与特定的数据库连接关联起来了。接下来,设置SqlCommand的CommandText属性,赋值为要执行的SQL语句。如果需要,可以设置...

    存储过程的调用(一种比较直观,结构清晰的方法)

    这样,当执行SQLCOMMAND对象时,这些参数值会被传递给存储过程。 最后,执行SQLCOMMAND对象。调用ExecuteNonQuery、ExecuteReader或ExecuteScalar方法来运行存储过程。根据存储过程是否返回结果集以及期望的结果...

    asp.net 调用带参数的存储过程

    综上所述,ASP.NET调用带参数的存储过程涉及到数据库连接的建立、SqlCommand对象的配置、参数的添加和执行。通过这种方式,开发者可以灵活地与数据库进行交互,同时利用存储过程带来的性能优势。在实践中,务必注意...

    C# 查询参数化例子

    接下来,我们添加参数到SqlCommand对象中。每个参数都由SqlParameter对象表示,我们需要设置其参数名、参数类型和值。例如,如果存储过程有一个名为`@inputParam`的输入参数,我们可以这样添加: ```csharp int ...

    在ASP.NET(c#)中调用带参数的存储过程最简便的方法(eg)

    为了向存储过程传递参数,我们需要创建一系列`SqlParameter`对象,并将它们添加到`SqlCommand`对象的`Parameters`集合中。 ```csharp SqlParameter[] parms = { new SqlParameter("@tuikushuliang", SqlDbType.Int...

    C#参数化查询,避免SQL注入

    在C#中,我们可以使用ADO.NET的`SqlCommand`对象来实现参数化查询。首先,创建一个`SqlCommand`实例,然后设置其`CommandText`属性为包含参数的SQL语句。接着,使用`AddWithValue`或`Add`方法为每个参数添加对应的值...

    c# 调用带参数的存储过程

    接着遍历参数数组,将每个参数添加到`SqlCommand`对象的`Parameters`集合中。 #### 存储过程定义 ```sql CREATE PROC [dbo].[pro_GetDifferenceTimeInfos] @AnalysisDate varchar(50), @Process_PTR int AS ...

    SqlCommand_ExecuteScalar方法

    SqlCommand_ExecuteScalar方法是.NET Framework中的SQL Server数据访问组件SQLClient的一部分,主要用于执行SQL查询或存储过程,并返回单个值。这个方法在处理那些预期只返回一个结果的数据操作时非常实用,比如查询...

    SQL参数化(防止SQL注入)

    这个方法将参数添加到SqlCommand对象中,然后执行该命令。在调用这个方法时,我们需要传递参数,例如string sql = "Update users SET userstateid =" + status + " WHERE Id = @UserId"; DBHelper.ExecuteCommand...

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

    将参数添加到SqlCommand对象,以便在执行时传递给存储过程。 8. **打开Sql连接对象**: ```csharp MyCon.Open(); ``` 打开到数据库的连接,以便执行命令。 9. **执行SqlCommand**: ```csharp MyCmd....

    连接DB 通用 sql语句大全 含参数不含参数

    在C#中,我们可以使用SqlCommand对象的Parameters集合来添加参数,并在执行SQL时传递值。例如: ```csharp SqlCommand cmd = new SqlCommand("SELECT * FROM Users WHERE ID = @userId", connection); cmd....

    ASP C# C++ .NET中统一的存储过程调用方法.doc

    在.NET中,我们可以使用ADO.NET API动态地构造SqlCommand对象,遍历查询结果,为每个参数创建SqlParameter,并添加到SqlCommand对象的Parameters集合中。然后执行存储过程,根据需求选择是否填充DataSet或处理...

    ADO.NET中命令参数(SqlParameter)使用示例

    现在,我们创建SqlParameter对象并将其添加到SqlCommand的Parameters集合中: ```csharp SqlParameter parameter = new SqlParameter("@UserID", SqlDbType.Int); parameter.Value = 123; // 这里假设ID为123 ...

    asp.net 父子关系的Command对象源码

    在VB.NET中,你可以通过定义一个递归函数来实现这个功能,该函数接收当前部门ID作为参数,使用Command对象执行嵌套查询,将结果添加到结果集中,并在需要时调用自身处理子部门。 总的来说,了解和掌握ASP.NET中...

    在VS2008下,利用c#在SQLSERVER2005实现两个数据库同步

    添加适当的异常处理代码,以便在出现错误时向用户显示友好的错误消息。 8. **测试与优化** 运行你的应用程序,确保在不同的数据库配置下都能正确同步数据。考虑添加日志功能,记录每次同步的详细信息,以便于调试...

    C#中Command对象的用法

    5. **Parameters属性**:这是一个参数集合,用于存储将传递给SQL语句或存储过程的参数。这对于动态构建SQL语句非常有用,可以防止SQL注入攻击。 #### 二、实战示例:执行SQL语句与存储过程 接下来,我们将通过具体...

    用c#窗体实现向数据库中添加图片

    在C#编程环境中,开发一个窗体应用来向数据库中添加图片涉及到多个步骤和技术。首先,我们需要理解如何处理图像文件,然后将它们转换为二进制数据,以便于存储在数据库中。通常,数据库系统如SQL Server不直接支持...

Global site tag (gtag.js) - Google Analytics