C# 很难找到好的SqlDataAdapter教程/让代码正常工作
我以前问过一个问题,关于如何将CSV文件简单地插入/更新到数据库中。我得到了一些我在这里采用的代码。记录列表是作为集合解析的CSV文件:C# 很难找到好的SqlDataAdapter教程/让代码正常工作,c#,sqldataadapter,C#,Sqldataadapter,我以前问过一个问题,关于如何将CSV文件简单地插入/更新到数据库中。我得到了一些我在这里采用的代码。记录列表是作为集合解析的CSV文件: SqlDataAdapter dataAdpater = new SqlDataAdapter( "SELECT * FROM Cats WHERE UniqueCatName = @UniqueCatName", "data source=localhost;initial catalog=Kitties;integrated security=Tr
SqlDataAdapter dataAdpater = new SqlDataAdapter(
"SELECT * FROM Cats WHERE UniqueCatName = @UniqueCatName", "data source=localhost;initial catalog=Kitties;integrated security=True;MultipleActiveResultSets=True;");
DataTable testTable = new DataTable();
dataAdpater.Update(testTable);
foreach (var record in recordList)
{
dataAdpater.SelectCommand.Parameters.AddWithValue("@UniqueCatName", record.UniqueCatName);
int rowsAdded = dataAdpater.Fill(testTable);
if (rowsAdded == 0)
{
testTable.Rows.Add(
record.UniqueCatName,
record.Forename,
record.Surname
);
}
else
{
}
}
dataAdpater.Update(testTable);
我有点盲目,我看了很多教程,但找不到一个能清楚演示如何使用SqlDataAdapter进行添加和更新的教程
从我读到的,你必须指定一个更新命令和一个插入命令?因此,我不完全确定上面的代码是怎么回事,但我想它可以在不给我额外指令的情况下进行简单的插入
虽然回答我之前问题的人给出了“else”一词,但我不知道该在“else”一词中加什么。我需要检索和更新特定的行,但我不知道怎么做。有什么想法吗?您可以从以下内容开始,它将从记录列表中添加所有记录:
string connectionString = ....;
SqlDataAdapter adapter = new SqlDataAdapter("Select * From Cats", connectionString);
// The command builder will generate the Add, Update and Delete commands
// based on the select command
SqlCommandBuilder cmdBuilder = new SqlCommandBuilder(adapter);
DataTable testTable = new DataTable("Cats");
adapter.Fill(testTable); // retrieve all existing rows
// Add each record from recordList
foreach (var record in recordList)
{
// TODO - Handle duplicates
testTable.Rows.Add(
record.UniqueCatName,
record.Forename,
record.Surname
);
}
adapter.Update(testTable);
如果有人感兴趣,我已经做了。这是未考虑因素的版本。如果不存在,它将插入,如果已经存在,则更新现有记录。我希望它能帮助将来的人:
SqlDataAdapter dataAdpater = new SqlDataAdapter(
"SELECT * FROM Cats WHERE URN = @URN", "data source=...");
dataAdpater.InsertCommand = new SqlCommand("INSERT INTO Cats VALUES (@URN, @Forename, @Middlename, @Surname)", new SqlConnection("data source=..."));
dataAdpater.UpdateCommand = new SqlCommand("UPDATE Cats SET Forename=@Forename, Middlename=@Middlename, Surname=@Surname WHERE URN=@URN", new SqlConnection("data source=..."));
DataTable testTable = new DataTable();
dataAdpater.Update(testTable);
dataAdpater.SelectCommand.Parameters.Add("@URN", SqlDbType.NVarChar, 256, "URN");
dataAdpater.InsertCommand.Parameters.Add("@URN", SqlDbType.NVarChar, 256, "URN");
dataAdpater.InsertCommand.Parameters.Add("@Forename", SqlDbType.NVarChar, 256, "Forename");
dataAdpater.InsertCommand.Parameters.Add("@Middlename", SqlDbType.NVarChar, 256, "Middlename");
dataAdpater.InsertCommand.Parameters.Add("@Surname", SqlDbType.NVarChar, 256, "Surname");
dataAdpater.UpdateCommand.Parameters.Add("@URN", SqlDbType.NVarChar, 256, "URN");
dataAdpater.UpdateCommand.Parameters.Add("@Forename", SqlDbType.NVarChar, 256, "Forename");
dataAdpater.UpdateCommand.Parameters.Add("@Middlename", SqlDbType.NVarChar, 256, "Middlename");
dataAdpater.UpdateCommand.Parameters.Add("@Surname", SqlDbType.NVarChar, 256, "Surname");
foreach (var record in recordList)
{
dataAdpater.SelectCommand.Parameters["@URN"].Value = record.URN;
int rowsAdded = dataAdpater.Fill(testTable);
if (rowsAdded == 0)
{
var newRow = testTable.NewRow();
newRow["URN"] = record.URN;
newRow["Forename"] = record.Forename;
newRow["MiddleName"] = record.MiddleName;
newRow["Surname"] = record.Surname;
testTable.Rows.Add(newRow);
}
else
{
foreach (DataRow row in testTable.Rows)
{
if (row[1].ToString() == record.URN)
{
row["Forename"] = record.Forename;
row["MiddleName"] = record.MiddleName;
row["Surname"] = record.Surname;
}
}
}
}
dataAdpater.Update(testTable);
就我个人而言,我会清理数据适配器并自己构建sql。。。显然参数化了!通过谷歌搜索,我相信数据适配器将以批量方式进行操作——因此,如果CSV很大,它将以相当快的速度插入/更新。否则,我只会使用实体框架一个接一个地做。我没有广泛地使用它们(因此我不尝试回答),但我总是发现它们令人沮丧(并且提出了与您所面临的问题完全相同的问题)。在一天结束时,他们所做的就是动态地构建insert语句——你可以做到!如果按此方法执行,请确保每个SqlCommand执行多个insert,并根据它使用的内部批处理系统进行适当的批处理。我已经做了一些事情,一个接一个地更新,这需要相当长的时间,足以让我愿意接受这一点上的头痛:注意:我必须添加一个索引到我的URN字段,否则更新方法会花费很长时间。插入13000条记录需要38秒,更新所有13000条记录需要55秒。