【问题标题】:Insert statement weird error插入语句奇怪的错误
【发布时间】:2013-03-13 05:42:14
【问题描述】:

我在 azure 中调用 Web 服务并使用以下方法填充数据库。不知道怎么回事。。

using (SqlConnection conn = new SqlConnection(cs))
{
   using (SqlCommand command = conn.CreateCommand())
   {
      conn.Open();
      string cmdText = String.Format("INSERT INTO UserFiles VALUES('" + obj.userRef.ToString() + "','name','name','name','name','name','name'");
      command.CommandText = cmdText;
      command.ExecuteNonQuery();
      conn.Close();
   }
}

这是错误信息:

System.Data.SqlClient.SqlException (0x80131904):语法不正确 在“名字”附近。

在 System.Data.SqlClient.SqlConnection.OnError(SqlException 异常, 布尔型 breakConnection,Action1 wrapCloseInAction)
at System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection, Action
1 wrapCloseInAction)
在 System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj, Boolean callerHasConnectionLock, Boolean asyncClose)
在 System.Data.SqlClient.TdsParser.TryRun(RunBehavior 运行行为, SqlCommand cmdHandler、SqlDataReader 数据流、 BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj, Boolean & dataReady)
在 System.Data.SqlClient.SqlCommand.RunExecuteNonQueryTds(字符串 方法名、布尔异步、Int32 超时)
在 System.Data.SqlClient.SqlCommand.InternalExecuteNonQuery(TaskCompletionSource`1 完成,字符串方法名,布尔型 sendToPipe,Int32 超时, 布尔 asyncWrite)
在 System.Data.SqlClient.SqlCommand.ExecuteNonQuery()
在 _4900ProjectDesktopInterface.Form1.uploadbutton_Click(Object sender, EventArgs e) 中 C:\Users\Ken\Documents\GitHub\MegaFileUploadConversionService\TestingTool\4900ProjectDesktopInterface\Form1.cs:line 152\r\nClientConnectionId:fb95122f-415b-484d-9438-903f0bf2aad0"

【问题讨论】:

  • 请将表格定义和cmdText的内容放入问题中。
  • obj.userRef.ToString() 的值是多少?如果它包含单引号或其他一些未转义的符号,那么它可能会破坏您的查询
  • sql 语句中至少缺少值的关闭 )。
  • 您应该始终使用parameterized queries。您的代码对SQL Injection_ attakcs 开放。
  • @LeeTaylor 不是真的 - 只要值的数量及其类型与架构匹配。

标签: c# sql-server tsql


【解决方案1】:

您的cmdText 需要在末尾多一个)

using (SqlConnection conn = new SqlConnection(cs))
{
   using (SqlCommand command = conn.CreateCommand())
   {
      conn.Open();
      string cmdText = String.Format("INSERT INTO UserFiles VALUES(@userRef, @name1, @name2, @name3, @name4, @name5, @name6)");
      command.Parameters.AddVithValue("@userRef", obj.userRef.ToString()); 
      command.Parameters.AddVithValue("@name1", name); 
      command.Parameters.AddVithValue("@name2", name); 
      command.Parameters.AddVithValue("@name3", name); 
      command.Parameters.AddVithValue("@name4", name); 
      command.Parameters.AddVithValue("@name5", name); 
      command.Parameters.AddVithValue("@name6", name); 
      command.CommandText = cmdText;
      command.ExecuteNonQuery();
      conn.Close();
   }
}

正如我在comment 中所说,您应该始终使用parameterized queries。您的代码对SQL Injection attakcs 开放

【讨论】:

  • 您可能想要更改您的答案以使用参数,就像您(正确地)在您对问题的评论中建议的那样。
【解决方案2】:
using (SqlConnection conn = new SqlConnection(cs))
{
   using (SqlCommand command = conn.CreateCommand())
   {
      conn.Open();
      string cmdText = String.Format("INSERT INTO UserFiles VALUES('" + obj.userRef.ToString() + "','name','name','name','name','name','name')");
      command.CommandText = cmdText;
      command.ExecuteNonQuery();
      conn.Close();
   }
}

你忘了右括号

【讨论】:

    【解决方案3】:

    看起来你没有终止值的左括号?为什么要使用 String.Format?并且您可以摆脱 conn.close,因为 using 语句会隐式执行此操作。

    using (SqlConnection conn = new SqlConnection(cs))
    {
       using (SqlCommand command = conn.CreateCommand())
       {
          conn.Open();
          string cmdText = "INSERT INTO UserFiles VALUES('" + obj.userRef.ToString() + "','name','name','name','name','name','name')";
          command.CommandText = cmdText;
          command.ExecuteNonQuery();
       }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多