6

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

        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”

这段代码的问题在哪里?有人对此有任何想法吗?

4

3 回答 3

5

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

"UPDATE [Student] SET Name = ? Where Id = ?";

通过使用System.Data.OleDb提供程序,参数的名称不再重要,但您需要确保参数的出现与将参数对象添加到命令对象参数集合的顺序相匹配。

编辑:如果你想保留@as 参数占位符,你可以改变这个:

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

DbProviderFactory dbFactory = DbProviderFactories.GetFactory("System.Data.SqlClient");
于 2013-08-20T05:09:52.940 回答
0

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

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

或者

DbParameter param1 = dbCommand.CreateParameter();
param1.SelectCommand.Parameters.AddWithValue("@Name", Textbox1.Text);
于 2013-08-20T05:14:27.007 回答
-1
command.CommandText = "EXEC [dbo].[PR_GetPurchase_ProjectBUDetails] " + prjID.ToString()+ " ," + empID.ToString();

调用时硬编码参数stored procedure
这解决了我的问题。

于 2019-02-05T08:31:24.717 回答