【问题标题】:Using a View from SQL Server 2008 in C# & Asp.net在 C# 和 Asp.net 中使用 SQL Server 2008 中的视图
【发布时间】:2011-09-29 21:17:28
【问题描述】:

我有一个 C#/ASP.net 项目,其中包含一个我开发的数据库,其中包含一个方便使用的漂亮且方便的视图。

我已设置到我创建的 SQL Server 2008 数据库的 SQL 连接。似乎连接正常,但我不明白如何实际使用我创建的视图而不将查询硬编码到程序中(被告知有时这很糟糕?)。

这是我设置的连接:

    SqlConnection conn = null;
    conn = new SqlConnection("Data Source=raven\\sqlexpress;Initial Catalog=ucs;Integrated Security=True;Pooling=False");
    conn.Open(); 
    SqlCommand command = new SqlCommand(query, conn);

基本上,我需要一些代码来使用此视图进行查询。我可以看到视图并查看将获得的结果,但不能在程序中访问它! 该视图名为“UserView”。非常感谢您的帮助!

【问题讨论】:

    标签: c# asp.net sql-server views


    【解决方案1】:

    您可以使用以下内容。但是将硬编码的 SQL 命令放入 .Net 代码中通常被认为是邪恶的。改用存储过程会更好、更安全。

    这应该可以帮助您入门。您可以通过

    修改它以使用存储过程
    1. 更改 command.CommandType 以表明它是一个存储过程调用
    2. 并将适当的参数添加到您的 SP 需要的命令中。
    3. command.CommandText 更改为您的 SP 的名称,因此 消除硬编码的 SQL。

    下面的示例代码:

    using (SqlConnection connection = new SqlConnection("Data Source=raven\\sqlexpress;Initial Catalog=ucs;Integrated Security=True;Pooling=False"))
    {
        using (SqlCommand command = connection.CreateCommand())
        {
            command.CommandText = "SELECT * from your_view WHERE your_where_clause";
    
            connection.Open();
            using (SqlDataReader reader = command.ExecuteReader())
            {
                while (reader.Read())
                {
                    // process result
                    reader.GetInt32(0); // get first column from view, assume it's a 32-bit int
                    reader.GetString(1); // get second column from view, assume it's a string
                    // etc.
                }
            }
        }
    }
    

    【讨论】:

    • 谢谢!这看起来不错,没有意识到我可以直接从视图中选择。但是,是否有我应该使用的程序集引用来允许我使用 ResultSet 和 ExecuteQuery?两者都是未知数。我添加了“使用 System.Data.SqlClient”,还有什么我遗漏的吗?
    • @Greg - 我认为 ResultSet 来自早期的编辑,因为我将其更改为使用 SqlDataReader。上面的代码不能为你编译吗?我相信 System.Data 程序集应该为您解析这些类。
    • @dcp - 好的,我们开始了,注意到第一个编辑,但错过了下一个。编译良好,尚未测试,但看起来不错。谢谢!只是为了确认一下,while 循环将遍历视图中的行,而里面的代码是你如何抓取每一列的数据?
    • @Greg - 是的,reader.GetInt32(0)、reader.GetString(1) 等只是示例,您需要输入适合您视图中返回的列的任何内容。但同样,我建议使用 SP,从长远来看会更好。
    • @dcp - 你说得对,先生。我使用这种方法只是为了让自己开始,但是由于我需要为这个程序进行大量查询,SP 绝对是要走的路。感谢您的帮助!
    【解决方案2】:

    使用 VS2013 将一个新的 DataSet 添加到您的项目中。将您的视图从服务器资源管理器拖到数据集设计图面上。

    【讨论】:

    • 请提供更详细的答案。
    • 这个答案很懒。究竟如何添加一个新的DataSet,从文件菜单、工具菜单,还是通过编写特定的代码行?如果你会提供一半的真相,而不是回答。
    猜你喜欢
    • 2012-12-04
    • 2012-02-15
    • 2013-08-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-09
    • 1970-01-01
    • 2012-01-06
    相关资源
    最近更新 更多