繁体   English   中英

仅使用 Sqlcommand 插入值与在 ADO.NET 中使用数据适配器插入值有什么区别?

[英]What is the difference of inserting values with just using the Sqlcommand vs. using a data adapter in ADO.NET?

我是 ADO.Net 的新手,我刚接触到数据适配器和数据集,但我还不能完全理解它们的概念。 这段代码有什么区别:

string firstName = "Jane";
string lastName = "Doe";
string age = 25;
    
string insertString = @"INSERT INTO dbo.Customer (FirstName, LastName, Age)
VALUES (@FirstName, @LastName, @Age)";
    
SqlCommand insertCommand = new SqlCommand(insertString, connection);
    
insertCommand.Parameters.Add("@FirstName", System.Data.SqlDbType.NVarChar, 100).Value = firstName;
insertCommand.Parameters.Add("@LastName", System.Data.SqlDbType.NVarChar, 100).Value = lastName;
insertCommand.Parameters.Add("@Age", System.Data.SqlDbType.Int).Value = age;
    
Console.WriteLine("Record has been added.");
    
connection.Open();
insertCommand.ExecuteNonQuery();

这个代码有吗?

SqlCommand selectCommand = new SqlCommand("SELECT * FROM dbo.Customer", connection);
SqlCommand insertCommand = new SqlCommand("INSERT INTO dbo.Customer (FirstName, LastName, Age) VALUES (@FirstName, @LastName, @Age)", connection);
    
insertCommand.Parameters.Add(new SqlParameter("@FirstName", SqlDbType.NVarChar, 30, "FirstName"));
insertCommand.Parameters.Add(new SqlParameter("@LastName", SqlDbType.NVarChar, 50, "LastName"));
insertCommand.Parameters.Add(new SqlParameter("@Age", SqlDbType.Int, 0, "Age"));
    
SqlDataAdapter dataAdapter = new SqlDataAdapter();
    
dataAdapter.SelectCommand = selectCommand;
dataAdapter.InsertCommand = insertCommand;
    
connection.Open();
    
DataSet dataSet = new DataSet("DataSet");
    
dataAdapter.Fill(dataSet, "Customer");
    
DataRow dataRow = dataSet.Tables[0].NewRow();
dataRow["FirstName"] = "Jane";
dataRow["LastName"] = "Doe";
dataRow["Age"] = 25;
    
dataSet.Tables[0].Rows.Add(dataRow);
    
dataAdapter.Update(dataSet, "Customer");
    
Console.WriteLine("Record has been added.");

为什么第二个代码使用数据集而不是直接将值插入数据库? 插入值的最佳方法是什么? 第一个还是第二个?

你是对的,第二种方法使用一组类似的 SQL 命令,并且也只插入一行。 对于相同的结果,这绝对是更多的努力。

但是,数据集、数据表和数据适配器的整个概念比本示例中显示的要强大得多。 数据集(和数据表)可以在 memory 中保留一组数据,记录对它们的更改,并在以后通过知道哪些语句用于哪种更改的数据适配器将它们持久化。

您可以决定在特定场景中是否需要数据集(或像实体框架这样的对象关系映射器)的好处,或者是否有一堆 SQL 命令来执行任务就足够了。

有关数据集和关键概念的详细信息,请参阅此链接。 链接详细说明了是否使用数据集或简单的 SQL 语句(使用数据阅读器)所涉及的一些因素。

好问题 - 虽然数据集不缓存数据,但它创建了一个与数据库分开的数据集,允许进一步操作数据。

在下面的文章中,有对游标的引用。 由于游标允许正向和反向读取(与仅正向相反,尽管可以指定该条件),因此它对于诸如售票之类的条件很有用。 在门票销售中,用户可以请求 10 张门票,但此时需要验证信用信息。 如果结果未经验证,则池保留在 state 中,在验证失败后,几乎可以立即将相同的门票出售给另一个买家。 这假设连接已锁定或数据集中的数据具有某种锁定机制。

将数据集与数据库分开允许使用称为“编组”的旧 ADO 术语。 基本上,在这种情况下,您对数据使用三点方法进行编组。 一,你有读取时提取的数据,二,你有当前的 state,三,你有一个编组条件,说在放回数据时覆盖数据,只放回发生变化的数据,但在哪里原版仍然与原版 state 相同(意味着它尚未更改)或完全失败并要求用户决定如何处理不匹配的更改。

https://docs.microsoft.com/en-us/dotnet/framework/data/adonet/retrieving-data-using-a-datareader

数据阅读器是一种不同的方法,但它解释了如何将数据与数据库分开保存。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM