我正在尝试通过c#中的代码找到最佳(快速和最简单)方式来访问SQL Server代码。
当我从书本中学习时,我遇到了多个建议,通常告诉我通过拖放来做。但是,因为我想在代码中执行它,所以第一个方法是按列号获取数据,但SQL查询中的任何重新排序(如添加/删除列)都让我难以修复。
例如(不要笑,有些代码就像2岁),我甚至编写了特殊的函数来传递sqlQueryResult并检查它是否为null):
public static void exampleByColumnNumber(string varValue) {
string preparedCommand = @"SELECT TOP 1 [SomeColumn],[SomeColumn2]
FROM [Database].[dbo].[Table]
WHERE [SomeOtherColumn] = @varValue";
SqlCommand sqlQuery = new SqlCommand(preparedCommand, Locale.sqlDataConnection);
sqlQuery.Prepare();
sqlQuery.Parameters.AddWithValue("@varValue) ", varValue);
SqlDataReader sqlQueryResult = sqlQuery.ExecuteReader();
if (sqlQueryResult != null) {
while (sqlQueryResult.Read()) {
string var1 = Locale.checkForNullReturnString(sqlQueryResult, 0);
string var2 = Locale.checkForNullReturnString(sqlQueryResult, 1);
}
sqlQueryResult.Close();
}
}
后来我发现它可能通过列名称(这似乎更容易阅读多列和大量更改顺序等):
public static void exampleByColumnNames(string varValue) {
string preparedCommand = @"SELECT TOP 1 [SomeColumn],[SomeColumn2]
FROM [Database].[dbo].[Table]
WHERE [SomeOtherColumn] = @varValue";
SqlCommand sqlQuery = new SqlCommand(preparedCommand, Locale.sqlDataConnection);
sqlQuery.Prepare();
sqlQuery.Parameters.AddWithValue("@varValue) ", varValue);
SqlDataReader sqlQueryResult = sqlQuery.ExecuteReader();
if (sqlQueryResult != null) {
while (sqlQueryResult.Read()) {
string var1 = (string) sqlQueryResult["SomeColumn"];
string var2 = (string) sqlQueryResult["SomeColumn2"];
}
sqlQueryResult.Close();
}
}
第三个例子是通过列名来实现的,但是使用.ToString()来确保它不是空值,或者通过在null检查上执行If / else。
public static void exampleByColumnNamesAgain(string varValue) {
string preparedCommand = @"SELECT TOP 1 [SomeColumn],[SomeColumn2], [SomeColumn3]
FROM [Database].[dbo].[Table]
WHERE [SomeOtherColumn] = @varValue";
SqlCommand sqlQuery = new SqlCommand(preparedCommand, Locale.sqlDataConnection);
sqlQuery.Prepare();
sqlQuery.Parameters.AddWithValue("@varValue) ", varValue);
SqlDataReader sqlQueryResult = sqlQuery.ExecuteReader();
if (sqlQueryResult != null) {
while (sqlQueryResult.Read()) {
string var1 = (string) sqlQueryResult["SomeColumn"].ToString();
DateTime var2;
DateTime.TryParse(sqlQueryResult["SomeColumn2"].ToString());
int varInt = ((int) sqlQueryResult["SomeColumn3"] == null ? 0 : (int) sqlQueryResult["SomeColumn3"];
}
sqlQueryResult.Close();
}
}
请记住,我刚刚为此示例创建了这个,并且可能存在一些拼写错误或一些轻微的语法错误,但主要问题是哪种方法最好,哪种方法最差(我知道第一种方法)是我最不喜欢的那个)。
我很快就要开始/重新编写我的小90k行应用程序的一部分,至少有3个广泛使用的例子,所以我想获得最好的速度方法,最好是最容易维护(希望它会是相同的)的形式给出)。
可能有更好的选择,请分享一下?
答案 0 :(得分:7)
看来你可能正在看旧书。如果您要以“老式的方式”进行,那么您至少应该使用using
块。总结:
using (var connection = new SqlConnection(connectionString))
{
using (var command = new SqlCommand(commandString, connection))
{
using (var reader = command.ExecuteReader())
{
// Use the reader
}
}
}
更好的是,请查看Entity Framework。
答案 1 :(得分:2)
如果你正在寻找 easy ,那么你不能做得比Linq-to-SQL更好: -
http://weblogs.asp.net/scottgu/archive/2007/05/19/using-linq-to-sql-part-1.aspx
如果您的SQL数据库已经存在,您可以在几秒钟内启动并运行。
否则,我同意约翰。
答案 2 :(得分:2)
你应该看一下这些教程,
[http://www.asp.net/learn/data-access/][1]
您计划的所有工作都已完成。
看看这种方式做同样的事情
string preparedCommand =
@"SELECT TOP 1 [SomeColumn],[SomeColumn2], [SomeColumn3]
FROM [Database].[dbo].[Table]
WHERE [SomeOtherColumn] = @varValue";
[1]: http://www.asp.net/learn/data-access/
更好的方法是使用LINQ TO SQL
var result = from someObject in SomeTable
where SomeColumnHasValue == ValueToCompare
select new { SomeColumn, SomeColumn1, SomeColumn2};
如果您有兴趣,以下是LINQ的一些很好的资源
希望有所帮助
答案 3 :(得分:1)
如果你正在考虑直接使用ADO.net,你可能想要找出微软企业库的数据访问应用程序块。大卫海登有一个decent article,详细介绍了如何使用它。
祝你好运,希望这有助于一些人。
答案 4 :(得分:1)
在我看来,在C#中进行数据访问的最简单方法是使用类型化的DataSet。其中很多都是拖放式的,在.NET 2.0+中比在.NET 1.0 / 1.1中更容易。
看看这篇文章,其中讨论了使用类型化DataSet和TableAdapter:
Building a DAL using Strongly Typed TableAdapters and DataTables in VS 2005 and ASP.NET 2.0
类型化DataSet基本上是数据的容器。您使用TableAdapter来填充它(使用SQL或存储过程发生,无论您喜欢哪种)并随后更新数据。 DataSet中每个DataTable中的列名都是从用于填充它们的SQL中自动生成的;数据库表之间的关系通过DataSet中的DataTables之间的关系进行镜像。
答案 5 :(得分:1)
不要仅将数据转换为字符串以尝试解析它; DataReaders有将SQL数据转换为.Net数据类型的方法:
using (var connection = new SqlConnection(Locale.sqlDataConnection))
using (var command = new SqlCommand(preparedCommand, connection))
using (var reader = command.ExecuteReader())
{
int stringColumnOrdinal = reader.GetOrdinal("SomeColumn");
int dateColumnOrdinal = reader.GetOrdinal("SomeColumn2");
int nullableIntColumnOrdinal = reader.GetOrdinal("SomeColumn3");
while (reader.Read())
{
string var1 = reader.GetString(stringColumnOrdinal);
DateTime var2 = reader.GetDateTime(dateColumnOrdinal);
int? var3 = reader.IsDBNull(nullableIntColumnOrdinal) ? null : (int?)reader.GetInt32(nullableIntColumnOrdinal);
}
}
答案 6 :(得分:0)
我测试了从sql server数据库获取数据的许多不同方法,我面对&发现最快的方法如下:
首先使用" IDataRecord"创建类。参数化方法根据您的要求属性。
class emp
{
public int empid { get; set; }
public string name { get; set; }
public static emp create(IDataRecord record)
{
return new emp
{
empid = Convert.ToInt32(record["Pk_HotelId"]),
name = record["HotelName"].ToString()
};
}
}
现在创建获取数据的方法如下:
public List<S> GetData<S>(string query, Func<IDataRecord, S> selector)
{
using (var cmd = conn.CreateCommand())
{
cmd.CommandText = query;
cmd.Connection.Open();
using (var r = cmd.ExecuteReader())
{
var items = new List<S>();
while (r.Read())
items.Add(selector(r));
return items;
}
}
}
然后调用函数如:
var data = GetData<emp>("select * from employeeMaster", emp.create);