2012-09-28 45 views
1

我见过使用C#访问数据库的很多方式我不知道哪一个方法对于简单的读/写/操作数据是“最好的”。我过去只是使用通用的DataSet/DataTable对象,但我试图使用更多的类型安全结构。我已经开始在visual studio中添加一个数据集(xsd)并连接到SQL服务器后端。使用c#和Visual Studio设计时数据集访问数据库

我想查询一个给定字符串的表中的列,但该列不是主键(所以我不能使用.Find())。我该怎么做呢?我需要使用LINQ还是可以使用扩展方法/ lambda表达式?

在更基本的层次上,使用设计时数据集时,是否需要使用表适配器来填充我使用的数据集中的每个表,或者只是实例化数据集?文档对我来说有点困惑。

+0

是否有任何理由不能在tableadapter中使用参数查询来定位所需的行,而不是先拉动所有数据然后再找到它? – peterG

回答

3

您可以使用Linq-To-DataSet这是最强大的方式(不是在效率方面,但在可读性和可维护性方面)查询DataSet

了解更多:Querying Typed DataSets

您可以选择在VS设计器上创建TableAdapterDataTable。如果添加一个TableAdapter,VS也创建相应的DataTable。如果你只添加一个DataTable,你必须提供你自己的方式来填充它。 TableAdapters类似于ADO.NET中的DataAdapter

所以,如果你已经创建了一个名为DataSet1数据集,并添加它选择了一个名为tabData表的TableAdapter,Visual Studio会自动创建一个名为tabDataDataTable数据表和TableAdapter命名tabDataTableAdapter在命名空间DataSet1TableAdapters

所以你可以用这种方式填写此表:

var dataSet = new DataSet1(); 
var da = new DataSet1TableAdapters.tabDataTableAdapter(); 
da.Fill(dataSet.tabData); 

假设表中的列NameAge和你想找到的所有行名称与"Jon"和年龄开始为> 30,你可以使用LINQ的Where

var jons = dataSet.tabData 
        .Where(r => r.Name.StartsWith("Jon") && r.Age > 30); 
foreach (DataSet1.tabDataRow row in jons) 
{ 
    Console.WriteLine("{0} is {1} years old", row.Name, row.Age); 
} 

注意,您可以使用LINQ到数据集类型安全(r.Name是一个字符串,r.Age一个int)。

+0

这看起来像是从数据库读取数据的好方法。可以使用链接到DS来将数据推送到数据库?该文似乎没有直接解决这个问题。 – FistOfFury

+1

@FistOfFury:如果你想要一个真正的ORM映射器,你可以使用'Linq-To-Sql'或'Linq-To-Enitites'。 'Linq-To-DataSet'只是'Linq-To-Objects'的一个子集,这有助于查询已经在内存中的对象。你当然可以使用'DataAdapter'来从'DataTable'中更新数据库。但那是ADO.NET,与Linq没有直接关系。 –

相关问题