【问题标题】:OleDbDataAdapter string concatenationOleDbDataAdapter 字符串连接
【发布时间】:2015-04-01 00:07:34
【问题描述】:

我有以下代码,它在数据库上执行简单的 SELECT 查询。如果我通过“组”字符串传递整个查询,则查询正常。但是如果我尝试连接字符串(只发送组ID)如下所示,我得到“查询表达式'ID ='group_data'中的语法错误”-注意三个'

我在 MSDN 上登峰造极,但找不到任何相关内容。

public void auth_st(string group)
    {
        conexiuneBD.Open();
        DataSet ds = new DataSet();
        OleDbDataAdapter adapter = new OleDbDataAdapter("SELECT Notif FROM teams WHERE ID='"+group+"'", conexiuneBD);
        adapter.Fill(ds);
        conexiuneBD.Close();

        DataTable dt = ds.Tables[0];
        foreach (DataRow dr in dt.Rows)
        {
            listBoxCerer.Items.Add(dr["Notif"].ToString());

        }

    }

任何帮助将不胜感激。我应该改用命令吗?

【问题讨论】:

  • ,听起来ID 是数字类型,而不是字符。你试过不带单引号吗?
  • 你的 id 是 varchar 还是 int ?
  • ID 是一个字符串(它包含诸如“331C”之类的东西
  • 连接参数绝对不是执行查询的正确方法。使用参数更好:请查看其他Question 以获取示例。
  • group 的值究竟是多少?我在您的查询中没有看到任何语法错误。

标签: c# string concatenation oledb oledbdataadapter


【解决方案1】:

字符串连接是very bad,你应该这样使用OleDB parameters

public void auth_st(string group)
{
    conexiuneBD.Open();
    DataSet ds = new DataSet();
    OleDbDataAdapter adapter = new OleDbDataAdapter("SELECT Notif FROM teams WHERE ID=?", conexiuneBD);
    adapter.SelectCommand.Parameters.AddWithValue("p1", group);
    adapter.Fill(ds);
    conexiuneBD.Close();

    DataTable dt = ds.Tables[0];
    foreach (DataRow dr in dt.Rows)
    {
        listBoxCerer.Items.Add(dr["Notif"].ToString());
    }
}

【讨论】:

  • 谢谢你,多亏了你的帮助,我终于搞定了!我会记住你的建议,你是一个救生员!衷心祝愿您有美好的一天!
  • 感谢您的接受 :) 我添加了一个链接(在“非常糟糕”中),它解释了 SQL 注入以及为什么连接 SQL 参数是错误的。
【解决方案2】:
public void auth_st(string group)
{
    string query="SELECT Notif FROM teams WHERE ID='{0}'";
    conexiuneBD.Open();
    DataSet ds = new DataSet();
    OleDbDataAdapter adapter = new OleDbDataAdapter(string.Format(query,group), conexiuneBD);
    adapter.Fill(ds);
    conexiuneBD.Close();

    DataTable dt = ds.Tables[0];
    foreach (DataRow dr in dt.Rows)
    {
        listBoxCerer.Items.Add(dr["Notif"].ToString());

    }

}

【讨论】:

  • 如果 group="331C" 我得到“查询表达式中的语法错误 'ID='331C'”
  • @user3605321 你确定你得到了SELECT Notif FROM teams WHERE ID='331C'查询错误吗?
  • ok 将查询文本放在一个变量中,并将其传递给 oledbdataadapter() 和 DEBUG 代码并将查询变量文本粘贴到此处。
  • 我试过了。我只收到一条错误消息,并且只有在调试窗口中出现这种情况 System.Data.dll A 中发生了“System.Data.OleDb.OleDbException”类型的第一次机会异常System.Windows.Forms.dll 中发生“System.Data.OleDb.OleDbException”类型的第一次机会异常线程 0xfb0 已退出,代码为 259 (0x103)。线程 0xebc 已退出,代码为 259 (0x103)。
猜你喜欢
  • 1970-01-01
  • 2014-03-31
  • 2010-10-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多