【问题标题】:Insert Access SQL Statement Not working in C#插入访问 SQL 语句在 C# 中不起作用
【发布时间】:2016-12-18 02:28:06
【问题描述】:

我有 C# 程序。我的代码生成这样的 SQL 语句:

INSERT INTO [TWEET_RESULT] ([SearchKeyword], [TweetID], [RetweetCount], [URL], [Body], [PostedTime], [Sentiment])
VALUES ("BVN", "tag:search.twitter.com,2005:528481176659697664", "1", "http://twitter.com/austin_ebi/statuses/528481176659697664", "Pls what is BVN going to be used for? Why can't every Nigerian just have 1 National Insurance number to be used for all purposes?", "2014-11-01T09:38:25.000Z", "NEUTRAL")

当我在 Access 数据库中执行此 SQL 语句时,它通过正确插入记录来工作。

但是,当我在 C# 代码中运行相同的查询以插入记录时。它什么都不做。

我使用双引号将字段值括起来的原因是因为某些字段值可以包含特殊字符。同样的查询,当只使用单引号将字段值括起来时,它之前工作过。

当我在 C# 代码中检查异常消息时。它说:

错误 [42000] [Microsoft][ODBC Microsoft Access Driver] '' 不是有效名称。确保它不包含无效字符或标点符号,并且不要太长。

【问题讨论】:

  • 我不认为问题是您的查询。尝试一个简单的选择查询,看看是否有效。从表中选择 1 条记录和 1 条,看看是否可行。
  • 抱歉,我不明白您所说的选择 1 条记录是什么意思。当我在 Microsoft Access 中运行插入 sql 语句时,它似乎会起作用。当我的 C# 代码尝试执行相同的 sql 查询时,它会遇到异常。
  • 如何将包含\、逗号等特殊字符的字段值括起来。由于特殊字符,我不能使用单引号。如果我使用双引号,它会从 C# 代码中消失。奇怪。
  • 我是说您已经向我们展示了您的插入查询,但该错误与您的插入查询无关。即使您选择它也会失败
  • 首先尝试这个qry然后检查它的查询问题还是你的代码。INSERT INTO [TWEET_RESULT] ([SearchKeyword], [TweetID], [RetweetCount], [URL], [Body], [ PostedTime], [Sentiment]) VALUES ("BVN", "test", "1", "test", "test, "2014-11-01T09:38:25.000Z", "NEUTRAL")

标签: c# sql ms-access


【解决方案1】:

考虑一个参数化查询,它可以避免任何需要引号或转义:

OdbcConnection conn = new OdbcConnection(connString);

String strSQL = "INSERT INTO [TWEET_RESULT] ([SearchKeyword], [TweetID], [RetweetCount], [URL], [Body], [PostedTime], [Sentiment]) " +
                "VALUES (?, ?, ?, ?, ?, ?, ?);"

OdbcCommand cmd = new OdbcCommand(strSQL, conn);
cmd.Parameters.Add("Search", OdbcType.Varchar).Value = "BVN";
cmd.Parameters.Add("TweetID", OdbcType.Varchar).Value = "tag:search.twitter.com,2005:528481176659697664";
cmd.Parameters.Add("Retweet", OdbcType.Varchar).Value = "1";
cmd.Parameters.Add("URL", OdbcType.Varchar).Value = "http://twitter.com/austin_ebi/statuses/528481176659697664";
cmd.Parameters.Add("Body", OdbcType.Varchar).Value = "Pls what is BVN going to be used for? Why can't every Nigerian just have 1 National Insurance number to be used for all purposes?";
cmd.Parameters.Add("PostedTime", OdbcType.Varchar).Value = "2014-11-01T09:38:25.000Z";
cmd.Parameters.Add("Sentiment", OdbcType.Varchar).Value = "NEUTRAL";

try
{
   conn.Open();

   Int affectedRows = cmd.ExecuteNonQuery();    
   Console.WriteLine("Affected Rows: {0}", affectedRows);
}
catch (Exception ex)
{
   Console.WriteLine(ex.Message);
}          

【讨论】:

  • 谢谢。我打算用参数化查询试试这个。
  • 我尝试了参数化查询,却得到了这个异常:错误 [07002] [Microsoft][ODBC Microsoft Access Driver] 参数太少。预期为 7。我验证了它像代码一样输入了 7 个值,但它说参数太少。
  • 似乎没有传递参数值。我不是 C# 专家,我是从教程网站上获取的。您是否在 MS Access 中使用 OleDbConnection 或 OdbcConnection?可能不允许命名参数。尝试使用问号作为占位符(仅在 SQL 语句中)并删除 .AddWithValue 中的 @
  • 我正在使用 Microsoft Access 的 ODBC 连接。
  • 我将 @ 替换为 ?在我的查询中。现在得到异常:错误 [07002] [Microsoft][ODBC Microsoft Access Driver] 参数太少。预计 14 日。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-28
  • 2012-08-05
  • 1970-01-01
  • 1970-01-01
  • 2012-03-25
相关资源
最近更新 更多