C#SqlCommand和非命名参数

问题描述:

我有一个庞大的程序,已经有大量的查询参数。C#SqlCommand和非命名参数

在整个项目中,我只有通过的IDbConnection,IDbCommand的访问到数据库等接口而不是直接使用的OleDbConnection,OleDbCommand的,等

这允许我使用不同的数据库引擎和连接类型与我的应用程序。直到现在,例如,我使用OleDbConnection连接到MS SQL Server数据库,OdbcConnection for MySql和SQLiteConnection从外部库,显然,SQLite。

现在我想尝试用SqlConnection替换OleDbConnection来连接到SQL Server,但是我发现参数化查询存在一些问题。

我是用来做这样的事情与参数化查询:

IDbCommand cmd = connection.CreateCommand(); 
cmd.CommandText = "UPDATE foo SET field1=? WHERE ID=?"; 
DbUtils.AddParameter(cmd, DbType.StringFixedLength, "hello"); 
DbUtils.AddParameter(cmd, DbType.Int32, 1); 
cmd.ExecuteNonQuery(); 

的AddParameter静态方法检查IDbCommand的类型和参数值添加到它。

这适用于上面指定的三种连接类型,但不适用于SqlConnection,它会引发错误:'?'附近的语法错误。

的SqlCommand似乎需要命名参数的工作:

IDbCommand cmd = connection.CreateCommand(); 
cmd.CommandText = "UPDATE foo SET [email protected] WHERE [email protected]"; 
DbUtils.AddParameter(cmd, DbType.StringFixedLength, "@pfield1", "hello"); 
DbUtils.AddParameter(cmd, DbType.Int32, "@pID", 1); 
cmd.ExecuteNonQuery(); 

你知道,如果它是不可能性,以避免使用命名参数,以保持与其他连接类型的兼容性?

谢谢!

Francesco

+0

您是否尝试过只用'@',而不是'?'? – krillgar

+0

@krillgar:我只是试过,但它给了我错误:**必须声明可扩展的变量'@'** – Formentz

+0

这就是我想它会做的,但值得一试。 – krillgar

我不这么认为。

SqlCommand.Parameters property

The Microsoft .NET Framework Data Provider for SQL Server does not support the question mark (?) placeholder for passing parameters to a SQL Statement or a stored procedure called by a command of CommandType.Text. In this case, named parameters must be used.

+0

谢谢,我没有在文档中找到该评论...似乎我必须继续使用OleDbProvider – Formentz

+0

@Formentz Glad帮助。您应该始终使用您当然需要的正确提供商;) –