OleCommand的SqlText占位符的问题

Mar 9, 2011 at 8:03 AM
string strSql = "insert into test_table"
+"(zdsxh,zdsbm,mc,fzrbh,bxrbh,bxrq,sjfrom,sjto)values"
+"(@zdsxh,@zdsbm,@mc,@fzrbh,@bxrbh,@bxrq,@sjfrom,@sjto)";

将strSql替换成
string strSql = "insert into test_table"
+"(zdsxh,zdsbm,mc,fzrbh,bxrbh,bxrq,sjfrom,sjto)values"
+"(?,?,?,?,?,?,?,?)";

替换占位符

使用正则表达式:
strSql = Regex.Replace(strSql ,  @"@[^,]*,", "?,", RegexOptions.IgnoreCase);

要加上
using System.Text.RegularExpressions;

替换占位符

string strSql = "insert into test_table"
                 + "(zdsxh,zdsbm,mc,fzrbh,bxrbh,bxrq,sjfrom,sjto)values"
                 + "(@zdsxh,@zdsbm,@mc,@fzrbh,@bxrbh,@bxrq,@sjfrom,@sjto)";
            strSql = Regex.Replace(strSql, "@\\w+", "?");

http://blog.sina.com.cn/s/blog_54b576bb0100anku.html

在使用access数据时,经常使用

string strSql="insert table_name(col1,col2,...,coln) values(@col1,@col2,...,@coln)";

来向数据库插入数据,写法居然是有毛病的,参照msdn,应该改为

string strSql="insert table_name(col1,col2,...,coln) values(?,?,...,?)";

来自msdn的解释:

如果 CommandType 设置为 Text,OLE DB.NET 提供程序不支持将参数传递给 OleDbCommand 调用的 SQL 语句或存储过程的命名参数。在这种情况下,必须使用问号 (?) 占位符。例如:

SELECT * FROM Customers WHERE CustomerID = ?

因此,OleDbParameterCollection 的顺序必须直接对应于参数的问号占位符的位置。

 

NET中SQL的Parameter占位符的使用

在一般的情况想在

  1. OLE DB .NET Framework 数据提供程序和 ODBC .NET Framework 数据提供程序不支持用于将参数传递到 SQL 语句或存储过程的命名参数。在此情况下,必须使用问号 (?) 占位符顺序必须与存储过程中所定义的参数顺序相匹配,如以下示例所示。SELECT * FROM Customers WHERE CustomerID = ?;在Access中你可以使用@CustomerId也可以使用“?”但是在DB2中你只能使用“?”,使用前者会出现错误提示。

一般的规则如下:

  1. SqlCommand should be '@' character
  2. OleDbCommand or OdbcCommand should be '?' character
  3. OracleCommand should be ':' character

 

in oleDbDriver add

public override IDbCommand GetDriverCommand(SqlStatement sql, IDbConnection conn)
        {

            //替换占位符
            //using System.Text;
            //using System.Text.RegularExpressions;
            string strSql = sql.SqlCommandText;
            strSql = Regex.Replace(strSql, @"@[^,]*,", "?,", RegexOptions.IgnoreCase);
            strSql = Regex.Replace(strSql, "@\\w+", "?");
            sql.SqlCommandText = strSql;

            IDbCommand e = ProviderFactory.CreateCommand();
            e.CommandText = sql.SqlCommandText;
            // for some database not supports CommandTimeout
            CommonHelper.CatchAll(() => e.CommandTimeout = sql.SqlTimeOut);

            e.CommandType = sql.SqlCommandType;
            e.Connection = conn;
            FillDbParameters(sql, e);
            return e;
        }

 

Coordinator
Mar 10, 2011 at 1:37 AM

http://dbentry.codeplex.com/workitem/30310