【发布时间】:2023-03-25 05:26:01
【问题描述】:
我知道我应该为此使用参数化查询,但它是用于插入文本文件的内部工具。有人看到未封闭报价的错误吗?奇怪的是,我在 SQL Server 2014 中运行它,它在我删除“和 ; 在值分配的末尾后成功运行。但在我的项目中的 Visual Studio 中它需要”; 这是我的代码:
for (int i = 0; i < ds.Tables[0].Rows.Count; i++)
{
string conn = ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString;
SqlConnection con = new SqlConnection(conn);
string query = "Insert into BluStar(ProductID,Manufacturer,SKU,BlueStarSKU,MSRP,RoughSummary,COST,Inventory,Weight,CAT4th,CAT1st,CAT2nd,CAT3rd,ProductName,Genre,ProductName2,RougherSummary,Cat_4th,Field1,Field2,Field3,Field4,Field5,Field6,Field7,Field8,Field9,Field10,Field11,Field12,Field13) Values('" + ds.Tables[0].Rows[i][0].ToString() + "','" + ds.Tables[0].Rows[i][1].ToString() + "','" + ds.Tables[0].Rows[i][2].ToString() + "','" + ds.Tables[0].Rows[i][3].ToString() + "','" + ds.Tables[0].Rows[i][4].ToString() + "','" + ds.Tables[0].Rows[i][5].ToString() + "','" + ds.Tables[0].Rows[i][6].ToString() + "','" + ds.Tables[0].Rows[i][7].ToString() + "','" + ds.Tables[0].Rows[i][8].ToString() + "','" + ds.Tables[0].Rows[i][9].ToString() + "','" + ds.Tables[0].Rows[i][10].ToString() + "','" + ds.Tables[0].Rows[i][11].ToString() + "','" + ds.Tables[0].Rows[i][12].ToString() + "','" + ds.Tables[0].Rows[i][13].ToString() + "','" + ds.Tables[0].Rows[i][14].ToString() + "','" + ds.Tables[0].Rows[i][15].ToString() +
"','" + ds.Tables[0].Rows[i][16].ToString() + "','" + ds.Tables[0].Rows[i][17].ToString() + "','" + ds.Tables[0].Rows[i][18].ToString() + "','" + ds.Tables[0].Rows[i][19].ToString() + "','" + ds.Tables[0].Rows[i][20].ToString() + "','" + ds.Tables[0].Rows[i][21].ToString() + "','" + ds.Tables[0].Rows[i][22].ToString() + "','" + ds.Tables[0].Rows[i][23].ToString() + "','" + ds.Tables[0].Rows[i][24].ToString() + "','" + ds.Tables[0].Rows[i][25].ToString() + "','" + ds.Tables[0].Rows[i][26].ToString() + "','" + ds.Tables[0].Rows[i][27].ToString() + "','" + ds.Tables[0].Rows[i][28].ToString() + "','" + ds.Tables[0].Rows[i][29].ToString() + "','" + ds.Tables[0].Rows[i][30].ToString() + "')";
con.Open();
SqlCommand cmd = new SqlCommand(query, con);
cmd.ExecuteNonQuery();
con.Close();
}
这是我必须从控制台转换为 MVC 以读取 csv 文件的代码。
<%@ Page Language="C#" %>
<html>
<head>
<title>read file insert into data base</title>
</head>
<body>
<%@Import namespace=System.Data %>
<%@Import namespace=System.Data.SqlClient %>
<%
System.IO.StreamReader sr = new System.IO.StreamReader("/testdata/test.csv");
string line;
while(sr.Peek() != -1)
{
line = sr.ReadLine();
String[] parts = line.Split('\t');
Response.Write(Server.HtmlEncode(parts[3]) + "<br/>");
string conn = "";
string Manu;
string sku;
Decimal msrp = Convert.ToDecimal(parts[4]);
conn = ConfigurationManager.ConnectionStrings["Conn"].ToString();
SqlConnection objsqlconn = new SqlConnection(conn);
objsqlconn.Open();
SqlCommand objcmd = new SqlCommand("Insert into ScanSource(Manufacture,SKU,MSRP) Values(@Manu, @sku,@msrp)", objsqlconn);
objcmd.Parameters.AddWithValue("@Manu",parts[1]);
objcmd.Parameters.AddWithValue("@sku",parts[3]);
objcmd.Parameters.AddWithValue("@msrp",msrp);
objcmd.ExecuteNonQuery();
}
%>
</body>
</html>
【问题讨论】:
-
使用调试器查看
query填充后的内容。如果需要,将 SQL 复制到 SSMS 并在那里运行。然后,阅读 SQL 注入攻击。 -
字符串中有撇号吗?
-
“内部”或不参数化您的查询是要走的路。此外,在编写查询时,不要害怕在每列之后添加空格(甚至是新行)。能够阅读这一点至关重要。如果我要调试它,我要做的第一件事就是格式化代码,使其清晰易读。然后我很可能会将其移动到存储过程中,添加一些验证、错误处理并正确处理我的连接对象。
-
您容易受到sql injection attacks 的攻击。修复它,你的语法错误就会消失。
-
找不到撇号。 @鬼。在 Sql 中运行它并且运行良好,但在查询末尾没有“;”。Visual Studio 不喜欢没有“;在末尾。我知道 sql 注入,但它是一种内部工具,不适用于实时生产。