在学习oledb.net 连接oracle,SQL语句里有单引号不知怎么解决,请教各位。
如下面一段代码:string sDB_Name, sDB_User, sDB_Passwd;
string s_contentA;  //要插入数据库的字符串
sDB_Name = "192.168.1.8";
sDB_User = "dbuser";
sDB_Passwd = "dbpwd";
//连接数据库
OleDbConnection sOraConn = new OleDbConnection();
sOraConn.ConnectionString ="Provider=MSDAORA;DATA SOURCE=(DESCRIPTION =(ADDRESS_LIST =(ADDRESS = (PROTOCOL = TCP)(HOST ="+sDB_Name + ")(PORT = 1521)))(CONNECT_DATA =(SERVICE_NAME = " +sDB_Name+")));PASSWORD=" + sDB_User+";PERSIST SECURITY INFO=True;USER ID=" + sDB_Passwd;
sOraConn.Open();
//构建SQL语句
OleDbCommand oraCmd = sOraConn.CreateCommand();
oraCmd.CommandText = "insert into mytb1 (contentA,contentB) values("?","测试")";
oraCmd.Parameters.Clear();
oraCmd.Parameters.Add(new OleDbParameter("@contentA", OleDbType.VarChar));
oraCmd.Parameters[0].Value = s_contentA;
oraCmd.ExecuteNonQuery();在这段代码中,s_contentA变量是个字符串,字符串里有单位引号,如“I dont't know”。SQL语句里单引号是特殊字作符,我应该怎么处理才能使这条语句正常插入数据库里?因为我是要循环调用进行数据插入的,而字符串变量s_contentA的内容是不定的,有时会出现单引号,有时不会出现,怎么处理?

解决方案 »

  1.   

    用个字符串代码就行,比如string str = "I don't know""+str+"
      

  2.   

    你是说oraCmd.CommandText = "insert into mytb1 (contentA,contentB) values("?","测试")";
    这一行改为:
    oraCmd.CommandText = "insert into mytb1 (contentA,contentB) values(" + s_contentA +",'测试')";
    这样是不行的,我试过。s_contentA里面的单引号使得SQL已经变成不符合SQL规则的语句。
      

  3.   

       #region 执行带参数sql语句或存储过程,返回所影响的行数
            /// <summary>
            ///  执行带参数sql语句或存储过程,返回所影响的行数
            /// </summary>
            /// <param name="cmdText">带参数的sql语句和存储过程名</param>
            /// <param name="cmdType">命令类型</param>
            /// <param name="cmdParms">参数集合</param>
            /// <returns>返回所影响的行数</returns>
            public static int ExecuteNonQuery(string cmdText, CommandType cmdType, OracleParameter[] cmdParms)
            {
                int count;
                try
                {
                    init();
                    cmd = new OracleCommand();
                    SetCommand(cmd, cmdText, cmdType, cmdParms);
                    count = cmd.ExecuteNonQuery();
                    cmd.Parameters.Clear();
                    conn.Close();
                }
                catch (Exception ex)
                {
                    throw new Exception(ex.Message.ToString());
                }
                return count;
            }
            #endregion
      IDbDataParameter[] param = db.CreateDBParameter(type,
                                            new string[] { "docdirid" },
                                            new DbType[] { DbType.String);
     new object[] { model.DocDirId})            int result = db.ExecuteNonQuery(sql, CommandType.Text, param);
      

  4.   

    我不会的,不过我也想问个问题:
    各位好
    请问我C#连接ORACLE的时候提示:
    -------------------------------
    ------------------------------------------------------
    消息内容ORA-12154: TNS: 无法解析指定的连接标识符---------------------------
    确定   
    ----------------------------------------------------------
    但是我PL_SQL连接正常
    请问这个是怎么回事呢?
      

  5.   

       string sql = "insert into mytb1 (contentA,contentB) values(:contentA,:contentB)";
                IDbDataParameter[] param = db.CreateDBParameter(type,
                                            new string[] { "contentA", "contentB" },
                                            new DbType[] { DbType.String, DbType.String },
                                            new object[] { "I don't know", "测试" });  int result = db.ExecuteNonQuery(sql, CommandType.Text, param);
      

  6.   


    string sDB_Name, sDB_User, sDB_Passwd;
    string s_contentA;  //要插入数据库的字符串
    sDB_Name = "192.168.1.8";
    sDB_User = "dbuser";
    sDB_Passwd = "dbpwd";
    //连接数据库
    OleDbConnection sOraConn = new OleDbConnection();
    sOraConn.ConnectionString ="Provider=MSDAORA;DATA SOURCE=(DESCRIPTION =(ADDRESS_LIST =(ADDRESS = (PROTOCOL = TCP)(HOST ="+sDB_Name + ")(PORT = 1521)))(CONNECT_DATA =(SERVICE_NAME = " +sDB_Name+")));PASSWORD=" + sDB_User+";PERSIST SECURITY INFO=True;USER ID=" + sDB_Passwd;
    sOraConn.Open();
    //构建SQL语句
    OleDbCommand oraCmd = sOraConn.CreateCommand();
    oraCmd.CommandText = "insert into mytb1 (contentA,contentB) values(:contentA,'测试')";
    oraCmd.Parameters.Clear();
    oraCmd.Parameters.Add(new OleDbParameter("contentA", OleDbType.VarChar));
    oraCmd.Parameters[0].Value = s_contentA;
    oraCmd.ExecuteNonQuery();
      

  7.   

    s_contentA.replace("'","''")
    要测试下,意思就是把一个单引号转换为两个单引号。
    这样oracle处理时就不转义了会保存一个单引号的。
      

  8.   

    oraCmd.CommandText = "insert into mytb1 (contentA,contentB) values("?","测试")";
    改成 
    oraCmd.CommandText = "insert into mytb1 (contentA,contentB) values(@contentA,"测试")";
      

  9.   


    提示感谢happy09li和anzhiqiang_touzi的回复。happy09li在第3楼的回复中有一句,cmd = new OracleCommand();所以,我想问问你们所说的方法是不是引用了System.Data.OracleClient命名空间?我引用的是System.Data.OleDb。我的数据库是us7ASCII字符集的,用System.Data.OracleClient命名空间无法正确显示中文。
      

  10.   

    感谢你的回复,按你说的方法,执行时提示出错,出错原因是"ORA-00936:missing expression",所以我想,还是没正确处理好单引号的问题。
      

  11.   


    这里的db是由什么创建的?看了帮助,CreateDBParameter属于DbCommand类,在System.Data.Common命名空间里,但没学会怎么创建一个DbCommand实例。