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
我不这么认为。
从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.
谢谢,我没有在文档中找到该评论...似乎我必须继续使用OleDbProvider – Formentz
@Formentz Glad帮助。您应该始终使用您当然需要的正确提供商;) –
您是否尝试过只用'@',而不是'?'? – krillgar
@krillgar:我只是试过,但它给了我错误:**必须声明可扩展的变量'@'** – Formentz
这就是我想它会做的,但值得一试。 – krillgar