从C#获取sql数据的最佳方法是什么?

时间:2010-01-27 21:58:09

标签: c# sql sql-server

我正在尝试通过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个广泛使用的例子,所以我想获得最好的速度方法,最好是最容易维护(希望它会是相同的)的形式给出)。

可能有更好的选择,请分享一下?

7 个答案:

答案 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

链接:Data Developer Center

答案 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};
  • 无类型安全问题
  • 在您身边用C#可视化数据库 努力工作
  • 在编译时减少错误
  • 少代码
  • 更高效

如果您有兴趣,以下是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);