SQL Server添加字符串值时的列名无效

我是SQL Server的新手

我创建了这样的表:

CREATE TABLE Accidents ( Id INT NOT NULL PRIMARY KEY IDENTITY, GUID VARCHAR(100), Latitude VARCHAR(100), Longitude VARCHAR(100), PhotoName VARCHAR(100) ) 

我已经创建了一个Web服务来向该表插入数据,如下所示:

  SqlConnection con = new SqlConnection(@"workstation id=DatabaseSample.mssql.somee.com;packet size=4096;user id=???;pwd=???;data source=DatabaseSample.mssql.somee.com;persist security info=False;initial catalog=DatabaseSample"); public string addAccidentToDatabase(string GUID, string imageBase64String, string latitude, string longitude, string photoName) { SqlCommand cmd = new SqlCommand("INSERT INTO Accidents (GUID,Latitude,Longitude,PhotoName) VALUES (" + GUID + "," + latitude + "," + longitude + "," + photoName + ")", con); try { con.Open(); cmd.ExecuteNonQuery(); } catch (Exception e) { return e.Message; } finally { con.Close(); } return "succeeded"; } 

所有这些东西托管到免费托管服务器。

当我从VS2010测试Web服务时,当我将数字传递给所有参数时,新行成功添加到表中。 但是当我将至少一个字符串传递给服务时,例如“a”,我得到了这个结果:

 Invalid column name 'a'. 

并且没有添加行。 我想知道他为什么把“a”视为列名? 有人可以帮忙吗?

我想知道他为什么把“a”视为列名?

这不难看出来。 您不应该开发软件,部署它并希望它运行。 你应该测试一下。 将执行代码解压缩为类方法,并从您的服务中调用它。 在开发时,您可以从unit testing或命令行程序或任何您想要测试的方法调用此方法。

您的问题:在查询中不要在字符串(或varchars,如果需要)周围添加引号。 如果您只是将查询字符串打印到控制台,您就会看到它。

但老实说,这是你的问题中最少的。 你不应该手工制作SQL。 至少使用参数化查询。 所以让你的查询是:

 "INSERT INTO Accidents (GUID, Latitude, Longitude, PhotoName) VALUES (@GUID, @Latitude, @Longitude, @PhotoName)" 

并绑定参数:

 cmd.Parameters.AddWithValue("@GUID", GUID); ... 

请用此替换您的代码。

  SqlCommand cmd = new SqlCommand("INSERT INTO Accidents (GUID,Latitude,Longitude,PhotoName) " + "VALUES (@guid, @lat, @long, @photo)", con); cmd.Parameters.AddWithValue("@guid", GUID); cmd.Parameters.AddWithValue("@lat", latitude); cmd.Parameters.AddWithValue("@long", longitude); cmd.Parameters.AddWithValue("@photo", photoName); 

为什么? 好吧,假设你的一个字符串包含一个引号。
查询将失败并出现语法错误。 但是不要停下来。 日期和十进制数怎么样? 您需要以对数据库全球化设置敏感的方式格式化它们,只是为了使具有不同设置的下一个客户失败。 参数将为您解决此问题。

最糟糕的 。 假设恶意用户在PhotoName的输入框中键入如下内容:

  p1.jpg'); DROP TABLE ACCIDENTS; -- 

这是一个很大的问题 – 它被称为Sql Injection ,是的,参数阻止了这一点。 我真的希望你不要在你有敏感信息的数据库上写这个代码。

你的字符串需要引号。 您只是直接替换值,因此SQL尝试将它们解析为列。

 SqlCommand cmd = new SqlCommand("INSERT INTO Accidents (GUID,Latitude,Longitude,PhotoName) VALUES ('" + GUID + "','" + latitude + "','" + longitude + "','" + photoName + "')", con); 

但是,您应该注意,这是非常不安全的代码。 它很容易出现SQL注入。 请尝试使用paramaterized查询。

我猜你的GUID值以a开头。 如果以3开头,你可能会得到更有趣的东西。

由于您将其作为字符串传递,而不是使用引号转义它,因此会收到错误。

 SqlCommand cmd = new SqlCommand("INSERT INTO Accidents (GUID,Latitude,Longitude,PhotoName) VALUES (" + "\"" + GUID + "\"," + latitude + "," + longitude + ",\"" + photoName + "\")", con); 

几点:

  1. 您应该以这种方式避免构建查询。 使用存储过程或参数化查询。

  2. 为什么要将guid存储为varchar() ? 有一个非常好的Guid数据类型可用。

  3. 不要在数据类型后命名列。

你需要单引号来字符串值

但我强烈建议您使用SQLInjections来避免任何SQLInjections攻击

您可以在此处找到使用SQL参数的示例