0

我正在编写一个小程序,将 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(如果数据库中不存在'datasets')或现有的 guid(如果存在'datasets',则获取现有的 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
                    );

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

4

1 回答 1

2

首先,就像其他人指出的那样,您对 SQL 注入持开放态度,因此,使用 SqlCommand 参数是一个更好的选择。你可以找到很多例子。

但是,如果代码只是用于将 csv 转换为插入,并且真的不太可能有人试图破解程序,我会说没关系。

基本上,你描述的没问题。但

   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 的列表。
于 2012-12-04T23:34:21.090 回答