0

这是我正在阅读有关@MSDN 的一种方法,我的问题是,例如,我是否想在存储过程上使用它,因为该存储过程的查询已经指定要从表中选择的列,如下所示:

SELECT Columnsome, columnother, , , , ...FROM thisSQLdbTable

尽管我想实现该特定方法的方法,但从我对 可将数据从 SQL Server 提取到 Asp.net DataTable的“最佳方法”进行的一些研究中,它似乎非常先进。

public static DataTable GetCustomerData(string dataSetName,
string connectionString)
{
DataTable table = new DataTable(dataSetName);

using (SqlConnection connection = new SqlConnection(connectionString))
{
    SqlDataAdapter adapter = new SqlDataAdapter(
        "SELECT CustomerID, CompanyName, ContactName FROM dbo.Customers", connection);

    DataTableMapping mapping = adapter.TableMappings.Add("Table", "Customers");
    mapping.ColumnMappings.Add("CompanyName", "Name");
    mapping.ColumnMappings.Add("ContactName", "Contact");

    connection.Open();

    adapter.FillSchema(table, SchemaType.Mapped);
    adapter.Fill(table);
    return table;
}

}

或者如果我通过SP指定所选列进行查询,这不是使用的方法

如果不需要选择/指定列,我实际上可以删除该存储过程

存储过程正在执行特定计算并使用计算结果更新表然后我将其切换为“模式”以从更新的表中选择结果。

我所做的是回收(;给它一个参数(位类型)存储过程,然后询问提供的bool/bit参数的值,如果它的状态为真,它会更新(执行它的原始任务)

如果它是假的,它会做一个选择操作,所以我会像使用 2 个单独的命令一样使用它

但现在我已经寻找一种更好的方法来将数据从 db 提取到数据表中

我放弃了两种方式的 SP,如果不打算将它们与我当前的 SP 一起使用,我将通过上面的示例进行选择,因为我当前的 SP 在提供GetCustomersData()上述服务时会进行预选。

所以问题是我是否需要让函数进行选择,或者我可以使用我的 sp 准备好的选择来提供它,以便使用 GetCustomersData() 来实现它,它只会执行其余任务并且只映射列被预选

4

2 回答 2

1

存储过程在这个用例中完全有效。但是,如果您想要更多正确映射的表,您有几个选项,其中一些超出了使用DataTables.

您可以使用强类型DataSets,也可以使用ORM( object relational mapper)。

参考:类型化数据集:http: //msdn.microsoft.com/en-us/library/esbykkzb (v=vs.71).aspx

参考:什么是 ORM:http ://en.wikipedia.org/wiki/Object-relational_mapping

ORM的例子

参考:实体框架:http: //msdn.microsoft.com/en-us/data/ef.aspx

参考:NHibernate: http: //nhforge.org/

于 2012-11-06T06:54:36.153 回答
1

对您的实际要求仍然有些困惑,但这里有:

我看到您在 C# 代码中使用直接查询,“最好的方法”是用它制作一个 SP,然后说:

SqlCommand command = conn.CreateCommand();
            SqlDataAdapter sqlAdapter = new SqlDataAdapter(command);
            command.CommandType = System.Data.CommandType.StoredProcedure;
            command.CommandText = "sp_GetCustomerData";

然后在您添加参数后,如果需要,请执行以下操作:

            conn.Open();
            sqlAdapter.Fill(dtResult);                
            conn.Close();

其中 dtResult 是数据表。因此,在这种情况下,您不需要进行任何映射,并且由于您使用的是数据库中的 SP,它的运行速度将比直接查询更快,并且您可以随时更改查询逻辑,而无需重新部署代码。

于 2012-11-06T07:05:24.657 回答