我正在编写一个小程序,它将csv文件转换为一系列插入语句到数据库中。该程序不了解数据库,因此编写的语句是一次性的,它们不能是动态的。
现在,每个数据集都有自己的guid,我想让语句查询数据库,根据它的名称确定数据集是否存在。所以我有:
sw.WriteLine("-- Determine if dataset exists from school name");
sw.WriteLine(string.Format(
"INSERT INTO DataSets (Guid, DataSets ) VALUES ('{0}', '{1}') WHERE NOT EXISTS (SELECT * FROM DataSets WHERE DataSetName = '{1}')",
Guid,
DataSetName
));
(如果我错了请纠正我,sql真的不是我的强项) 现在,下一个问题是数据集的Guid用于其他一些表,例如:
string sql = string.Format(
"INSERT INTO Table1 VALUES ('{0}', '{1}', '{2}', {3}, '{4}');",
object.value1
object.value1
object.value1
object.value1
Guid
'Guid'不能用作c#中的变量,但它可以是新的Guid(如果数据库中不存在数据集)或现有的guid(如果'数据集'存在,则获得现有的GUID)
所以我需要这样的东西:
string sql = string.Format(
"INSERT INTO Table1 (Data1, Data2, Data3, Data4) VALUES ('{0}', '{1}', '{2}', {3});",
object.value1
object.value1
object.value1
object.value1
string sql2 = string.Format("INSERT INTO Table1 (Data5) VALUES (SELECT Guid FROM Datasets WHERE DataSetName = '{0}');
Guid
);
这是一个很好的(甚至是有效的)方式吗?
答案 0 :(得分:2)
首先,像其他人指出的那样,你是开放的SQL注入,所以,使用SqlCommand参数是一个更好的选择。你可以找到很多例子。
但是,如果代码仅用于将csv转换为insert,并且不太可能有人试图破解该程序,我会说它没问题。
基本上,你描述的是好的。但
string sql2 = string.Format("INSERT INTO Table1 (Data5) VALUES (SELECT Guid FROM Datasets WHERE DataSetName = '{0}');
Guid
);
你应首先检查它是否返回guid或null
SELECT Guid FROM Datasets WHERE DataSetName = '{0}'
然后决定是否创建一个新的guid并插入。
如果你只进行一次导入,你甚至不需要检查是否存在guid。你从代码创建一个guid,将其插入到sql中。这是因为它是guid,在一个批次中创建相同guid的概率确实很小,但理论上它不是零。