【问题标题】:OleDb ExceptionOleDb 异常
【发布时间】:2016-07-21 16:01:31
【问题描述】:

搜索了 5 个小时,我找不到我的错误。我得到了这个例外。怎么了?

MyDictionary.exe 中出现“System.Data.OleDb.OleDbException”类型的未处理异常

附加信息:INSERT INTO 语句中的语法错误。

我的代码:

public void Insert(Word word)
{
    string language=FindLanguage();
    try
    {
        command.CommandText ="INSERT INTO "+language+" ( Native , Foreign , Definition , AddingDate)  values ( '" + word.Native + "' , '" + word.Foreign + "' , '" + word.Definition + "' ,'" + word.AddingDate + "')";
            command.CommandType = System.Data.CommandType.Text;
            connection.Open();

            command.ExecuteNonQuery();
    }
    catch (Exception)
    {
        throw;
    }
    finally
    {
        if (connection != null)
        {
            connection.Close();
        }
    }
}

【问题讨论】:

  • 异常中是否有更多信息,或任何内部异常?生成的 SQL 语句是什么样的?如果从 Access IDE 执行,它可以工作吗?
  • 使用参数避免sql注入和格式化错误。另外,请尝试在语言变量周围加上括号:[" + language + "],以防其中有空格或冲突字符。
  • 把字符串组合成一个变量,这样就可以调试输出命令字符串了……然后把它赋值给CommandText。我敢打赌,您的组合语句中出现了某种意想不到的语法。
  • 特别是,如果您的任何条款中有单引号,这将导致语法无效。您的定义列将是发生这种情况的候选者。如上所述,参数使这个问题消失。
  • @LarsTech 没有任何改变,我得到同样的异常

标签: c# ms-access oledb oledbexception


【解决方案1】:

你应该在你的插入语句中使用参数。而且看起来你缺少command.Connection = connection;。 请注意,您的 SQL 很容易出现 SQL Injection

command.CommandText ="INSERT INTO "+language+"([Native],[Foreign],[Definition],[AddingDate]) VALUES (@Native,@Foreign,@Definition,@AddingDate)";

command.Parameters.AddWithValue("@Native", word.Native);
command.Parameters.AddWithValue("@Foreign",word.Foreign);
command.Parameters.AddWithValue("@Definition",word.Definition);
command.Parameters.AddWithValue("@AddingDate",word.AddingDate);

command.CommandType = System.Data.CommandType.Text;
command.Connection = connection;
connection.Open();

command.ExecuteNonQuery();

【讨论】:

  • 在你的列([Native]、[Foreign]、...)周围加上括号 []。您可能会与保留字(尤其是外语)发生冲突。
  • 刚刚工作,谢谢
  • @RavilYahyayev 太好了,如果有帮助,请将其标记为答案
  • @JohnPrideaux 谢谢,已编辑。
【解决方案2】:

在 OleDb 中,INSERT INTO 语句的正确语法涉及使用SELECT 子句,即使您附加 静态值。所以你需要像下面的例子一样改变你的查询。

此外,如果您实际上没有处理引发的异常,请不要构造 try...catch..finally。为了处置,请改用using() { } 块。所以这里是:

public void Insert(Word word)
{
    string language=FindLanguage();

    using (var connection = new OleDbConnection("connection string goes here"))
    using (var command = new OleDbCommand...)
    {
        command.CommandText = @
            "INSERT INTO " + language + "(Native, Foreign, Definition, AddingDate)" +
            "SELECT '"
                + word.Native + "' AS Native, '" 
                + word.Foreign + "' AS Foreign, '" 
                + word.Definition + "' AS Definition, '"
                + word.AddingDate + "' AS AddingDate"
        ;

        connection.Open();

        command.ExecuteNonQuery();

        connection.Close();
    }
}

【讨论】:

  • 我使用了 VALUES(就像 OP 一样)而不是 SELECT 并且从来没有遇到过问题。
  • 这很有趣。使用VALUES 时总是出现此错误。 OleDb 只是不明白。 SQL server 可以使用VALUES
  • 很奇怪。顺便说一句,关于 try/catch/throw 的好建议。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-10-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-21
  • 2010-11-30
  • 1970-01-01
相关资源
最近更新 更多