C# 将参数添加到dbc命令时出现异常

C# 将参数添加到dbc命令时出现异常,c#,sql,ado.net,C#,Sql,Ado.net,我需要一个带参数的update命令,由于某些原因我不能使用存储过程,实际上我们生成的update命令依赖于数据库、表和列,我们使用以下形式: string conStr = "Provider=SQLNCLI10;Server=.\\sql2008;DataBase=MyDataBase;Trusted_Connection=true;"; DbProviderFactory dbFactory = DbProviderFactories.GetFactory(

我需要一个带参数的update命令,由于某些原因我不能使用存储过程,实际上我们生成的update命令依赖于数据库、表和列,我们使用以下形式:

        string conStr = "Provider=SQLNCLI10;Server=.\\sql2008;DataBase=MyDataBase;Trusted_Connection=true;";

        DbProviderFactory dbFactory = DbProviderFactories.GetFactory("System.Data.OleDb");
        DbConnection dbConnection = dbFactory.CreateConnection();
        dbConnection.ConnectionString = conStr;

        DbCommand dbCommand = dbFactory.CreateCommand();
        dbCommand.CommandText = "UPDATE [Student] SET Name = @Name Where Id = @Id";

        DbParameter param1 = dbCommand.CreateParameter();
        param1.ParameterName = "@Name";
        param1.Value = "LOL";
        DbParameter param2 = dbCommand.CreateParameter();
        param2.ParameterName = "@Id";
        param2.Value = 5;

        dbCommand.Parameters.Add(param1);
        dbCommand.Parameters.Add(param2);

        dbConnection.Open();
        dbCommand.ExecuteNonQuery();
        dbConnection.Close();
但有一个例外:

必须声明标量变量“@Name”


此代码中的问题在哪里?有人对此有想法吗?

当您使用
System.Data.OleDb
作为数据库提供程序(无论您使用的是sql server)时,您需要使用
作为参数占位符,如:

"UPDATE [Student] SET Name = ? Where Id = ?";
通过使用
System.Data.OleDb
提供程序,参数的名称不再重要,但您需要确保参数的出现顺序与parameterobjects添加到command objects参数集合的顺序相匹配

编辑: 如果要将
@
保留为参数占位符,只需更改以下内容:

DbProviderFactory dbFactory = DbProviderFactories.GetFactory("System.Data.OleDb");


试试看,让我知道它是否有效

DbParameter param1 = dbCommand.CreateParameter();
param1.ParameterName.AddWithValue("@Name", Textbox1.Text);

调用
存储过程时硬编码参数


这解决了我的问题。

您在哪一点将命令与连接相关联?是工厂做的吗?还有,在哪一行出现异常?@Nilesh给我这个答案,但是
Odbc
命令如何,它是否像
Oledb
一样工作?这是我试图回答的问题,但帖子突然回到了原始状态,没有任何评论或答案@Nilesh答案已被所有者删除,我很幸运看到您的链接我找到了它:
DbParameter param1 = dbCommand.CreateParameter();
param1.ParameterName.AddWithValue("@Name", Textbox1.Text);
DbParameter param1 = dbCommand.CreateParameter();
param1.SelectCommand.Parameters.AddWithValue("@Name", Textbox1.Text);
command.CommandText = "EXEC [dbo].[PR_GetPurchase_ProjectBUDetails] " + prjID.ToString()+ " ," + empID.ToString();