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);
几点:
-
您应该以这种方式避免构建查询。 使用存储过程或参数化查询。
-
为什么要将
guid
存储为varchar()
? 有一个非常好的Guid
数据类型可用。 -
不要在数据类型后命名列。
你需要单引号来字符串值
但我强烈建议您使用SQLInjections
来避免任何SQLInjections
攻击
您可以在此处找到使用SQL参数的示例
- 在.net获得ssl证书
- 如何修复,无法加载文件或程序集“XXX”或其中一个依赖项。 强名称签名无法validation
- ASP.NET中的HostingEnvironment.QueueBackgroundWorkItem()用于小型后台任务
- 使用Chart.js创建图表使用C#字符串会导致问题
- 在这种情况下,安全风险设置EnableEventValidation =“false”吗?
- asp.net gridview checkall和uncheckall在一个标题复选框中
- 持久性AuthCookie已设置,但被重定向到登录
- 可以通过等号将表复制到另一个表吗? 如果没有,那怎么样?
- 在C#ASP.NET中添加自定义hashAlgorithmType