在c#中生成sql语句 - 将表值插入到新表中

时间:2012-12-04 23:16:01

标签: c# sql

我正在编写一个小程序,它将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
                    );

这是一个很好的(甚至是有效的)方式吗?

1 个答案:

答案 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的概率确实很小,但理论上它不是零。

  • 如果您不需要知道数据库中已有的guid(即您只需要导入一次),则不必连接到数据库。你可以使用你使用的所有guid轨道列表。