【问题标题】:What do C# Table Adapters actually return?C# 表适配器实际返回什么?
【发布时间】:2010-06-16 15:33:03
【问题描述】:

堆栈溢出!

我正在开发一个在 Windows 窗体应用程序中操作 SQL 表的应用程序。到目前为止,我只使用了预生成的填充查询,以及自制的更新和删除查询(什么都不返回)。

我有兴趣存储单个列中的单个值的值('nchar(15)' 名称),虽然我已经轻松编写了 SQL 代码以将该值返回给应用程序,但我不知道它将返回什么。

SELECT [Contact First Name] FROM ContactSkillSet
WHERE [Contact ID] = @CurrentID

结果可以直接存储为字符串吗?我需要投吗?调用 toString 方法?

谢谢!

编辑:有趣的是,以下工作:

String firstName = this.contactSkillSetTableAdapter.GrabFirstName(userKey);

Visual Studio 数据向导的乐趣,我想。

【问题讨论】:

    标签: c# sql winforms


    【解决方案1】:

    TableAdapter 用于填充 DataTable。您的示例查询的结果仍将是一个 DataTable,但单行中只有一列。您可以使用以下方法获取值:

    var adapter = new SomeKindOfTableAdapter();
    var dataTable = new DataTable();
    
    adapter.Fill(dataTable);
    
    string contactFirstName = (string)dataTable.Rows[0][0];
    

    还有其他方法可以在不使用表适配器的情况下获得价值:

    string query = @"SELECT [Contact First Name] 
                    FROM ContactSkillSet 
                    WHERE [Contact ID] = @Current";
    
    string result;
    
    using(SqlConnection conn = new SqlConnection(connString))
    {
        conn.Open();
    
        using(SqlCommand command = new SqlCommand(query, conn))
        {
            result = (string)command.ExecuteScalar();
        }
    }
    

    【讨论】:

    • 技术上你是对的,但我不知道我是否会鼓励这种方法。
    • @R0MANARMY - 我同意。我添加了另一种我更喜欢的方法。
    • 我已经有了表格适配器,因为我还使用列表视图来显示表单中其他地方的一些其他数据。不鼓励一种方法或另一种方法是否有特殊原因? (阿拉@R0MANARMY)
    • @Raven Dreamer:一种方法比另一种更能显示意图。当您看到DataAdapter.Fill 时,您通常假设数据库正在返回一组行。当您看到ExecuteScalar 时,通常假设您得到的是一个单一的值。使在您之后处理此代码的人更容易。
    • @R0MANARMY 啊,如果有什么安慰的话,我没有将查询方法命名为“Fill”。注意到了,谢谢。
    【解决方案2】:

    如果您打算从查询中返回单个结果,您始终可以在 SqlCommand 类上使用 ExecuteScalar 方法,然后将其转换为字符串(参见第一个链接中的示例,它将其转换为 Int32,但字符串的原理相同)。

    【讨论】:

      【解决方案3】:

      返回单个值的 SQL 语句称为标量查询。通常使用 COUNT、MAX 和 MIN 等聚合命令的语句属于这一类。像您的示例这样的其他语句也被视为标量。

      基本上,您可以像对待任何其他查询一样对待它。检查是否至少有一行,如果有,则将行零列零转换为适当的数据类型。如果您使用的是强类型数据集,有一些功能可以让这更容易,但不是必须这样做。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多