2013-03-23 135 views
1

我正在调用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,动作1 wrapCloseInAction)
at System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection, Action
1 wrapCloseInAction)
在System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj,布尔callerHasConnectionLock,布尔asyncClose)
在System.Data.SqlClient.TdsParser.TryRun(runBehavior runBehavior, 的SqlCommand cmdHandler,SqlDataReader的数据流, BulkCopySimpleResultSet bulkCopyHandler,TdsParserStateObject stateObj,布尔& 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(对象发件人,EventArgs e)如 C:\用户\肯\文件\ GitHub的\ MegaFileUploadConversionService \ TestingTool \ 4900ProjectDesktopInterface \ Form1.cs:line 152 \ r \ nClientConnectionId:fb95122f-415b-484d-9438-903f0bf2aad 0"

+4

把问题的表格定义和cmdText的内容。 – 2013-03-23 11:15:24

+1

'obj.userRef.ToString()'的值是什么?如果它包含一个单引号或其他一些非转义符号,那么它可能会破坏您的查询 – 2013-03-23 11:15:45

+3

至少在关闭时)值是从sql语句中丢失的。 – Goran 2013-03-23 11:16:16

回答

3

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

+0

你可能想要改变你的答案来使用参数,就像你(理所当然地)在你对该问题的评论中建议的那样。 – 2013-03-23 11:34:09

+0

@ Christian.K更新了';)'谢谢你的警告.. – 2013-03-23 11:42:31

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(); 
    } 
} 

你忘了关闭右边括号里

0

它看起来像你不终止的值开括号?为什么你使用String.Format?你可以摆脱conn.close,因为使用声明会隐含地做到这一点。

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(); 
    } 
}