2013-08-20 63 views
6

我需要一个带有参数的更新命令,由于某些原因,我不能使用存储过程,实际上我们根据数据库,表和列生成更新命令,我们使用以下表单:添加参数到DbCommand的例外

 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”

问题出在哪里在这个鳕鱼è?有没有人有这个想法?

+0

在这一点你与连接的命令相关联?工厂做到了吗?另外,你会在哪一行发生异常? – Renan

+0

@Nilesh给我这[链接](http://msdn.microsoft.com/en-us/library/system.data.oledb.oledbcommand.parameters.aspx)这是答案,但如何'Odbc'命令,是像'Oledb'一样工作吗? –

回答

5

当您使用System.Data.OleDb数据库供应商(无论您使用的是SQL服务器),你需要使用?作为参数占位符,如:

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

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

编辑: 如果你想保持@作为参数占位符你可以改变这一点:

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

DbProviderFactory dbFactory = DbProviderFactories.GetFactory("System.Data.SqlClient"); 
+1

这就是我想要回答的,但突然之间,这个帖子又回到原来的状态,没有任何评论或答案! – Nilesh

+0

'OdbcCommand'如何? –

+0

@Nilesh答案已被所有者删除,我只是很幸运地看到你的链接 –

0

试一下,让我知道,如果它的工作原理。

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

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