假设我在C#中有一个包含与SQL Server数据库表中的字段对应的文本框的表单,我想从表中提取数据并填充文本框。
从VS2005开始,我熟悉以下代码模式:
command = conn.CreateCommand();
command.CommandText = "SELECT * FROM Customer WHERE ID = " + CustId;
reader = command.ExecuteReader();
FormCustomer.textBoxName = reader.GetString(reader.GetOrdinal("Name"));
FormCustomer.textBoxAddress = reader.GetString(reader.GetOrdinal("Address"));
FormCustomer.textBoxSuburb = reader.GetString(reader.GetOrdinal("Suburb"));
目前在C#4.0中使用VS2010执行此操作的方法是什么?
答案 0 :(得分:5)
你获得它的方式当然是一种选择,尽管你应该使用参数化SQL而不是动态创建SQL。 (我希望你也有适当的using
陈述来关闭连接等。)
其他选择:
DataTable
(仍然是基本的ADO.NET)这只是我的头脑。肯定会有更多。
答案 1 :(得分:1)
看看SimpleData项目:
需要易于使用的数据库访问组件 这可以防止SQL注入攻击而不需要很多 样板ADO.NET代码或预生成的ORM模型。灵感来自 Ruby的ActiveRecord和DataMapper宝石。
使用SimpleData,您的代码将如下所示:
var customer = db.Customer.FindById(CustId);
FormCustomer.textBoxName = customer.Name;
FormCustomer.textBoxAddress = customer.Address;
FormCustomer.textBoxSuburb = customer.Suburb;
答案 2 :(得分:1)
Linq to SQL: http://msdn.microsoft.com/en-us/library/bb386976.aspx
实体框架: http://msdn.microsoft.com/en-us/library/aa697427%28v=vs.80%29.aspx
长话短说,后者是从Linq女士到SQL的主要ORM工具,这是一个从小而简单的事情开始的好方法。
答案 3 :(得分:1)
没有单一的“目前接受”方式;我很懒,所以我用的是小巧玲珑;所以我的方法是:
var cust = conn.Query(
"select Name, Address, Suburb from Customer where Id = @CustId",
new {CustId}).Single();
FormCustomer.textBoxName = cust.Name;
FormCustomer.textBoxAddress = cust.Address;
FormCustomer.textBoxSuburb = cust.Suburb;
还有Query<T>
等填充类型对象,但在上面dynamic
用法(如图所示)可能没问题。 new {CustId}
指定参数 - 完全命名,键入和SQL注入安全(注意匿名类型中的CustId
与TSQL中的@CustId
匹配)。没有搞乱命令和读者,非常快。
答案 4 :(得分:0)
这取决于你必须做什么。您的代码当然仍然有效,并且没有明确的模式,但它是面向连接的。另一种方法是使用DataSet,SqlDataAdapter等的“无连接”方法。请看这里:http://www.csharp-station.com/Tutorial/AdoDotNet/Lesson05。
编辑:这是一个带有SqlDataAdapter的版本:
DataSet dsCustomers = new DataSet();
SqlDataAdapter daCustomers =
new SqlDataAdapter("SELECT * FROM Customer WHERE ID = " + CustId, conn);
SqlCommandBuilder cmdBldr = new SqlCommandBuilder(daCustomers);
daCustomers.Fill(dsCustomers, tableName);