C#中的数据库编程,从Stored Proc返回输出

时间:2011-01-09 17:48:22

标签: c# .net

我正在努力了解如何将存储过程与应用程序连接起来。我的示例很简单,但它不会在命令提示符中显示我的列和行,而是显示System.Data.SqlClient.SqlDataReader。如何显示存储的procudure中的行?

----Stored Proc--

ALTER PROCEDURE dbo.SelectID
AS
SELECT * FROM tb_User;
-----

以下是代码:

using System;
using System.Data.SqlClient;
using System.IO;


namespace ExecuteStoredProc
{
    class Program
    {
        static void Main(string[] args)
        {

            SqlConnection cnnUserMan;
            SqlCommand cmmUser;
            //SqlDataReader drdUser;

            //Instantiate and open the connection
            cnnUserMan = new SqlConnection("Data Source=.\\SQLEXPRESS;AttachDbFilename=c:\\Program Files\\Microsoft SQL Server\\MSSQL10.SQLEXPRESS\\MSSQL\\DATA\\UserDB.mdf; Integrated Security=True;Connect Timeout=30;User Instance=True");
            cnnUserMan.Open();

            //Instantiate and initialize command
            cmmUser = new SqlCommand("SelectID", cnnUserMan);
            cmmUser.CommandType = System.Data.CommandType.StoredProcedure;

          //drdUser = cmmUser.ExecuteReader();
           Console.WriteLine(cmmUser.ExecuteReader());
            Console.ReadLine();
        }
    }
}

感谢。

4 个答案:

答案 0 :(得分:3)

cmmUser。ExecuteReader()执行存储过程并返回SqlDataReader对象。因此,您需要使用您注释掉的SqlDataReader:

SqlDataReader drdUser;

drdUser = cmmUser.ExecuteReader();
while(drdUser.Read()){
   //You can get at each column in the row by indexing the reader using either the column number
   // like drdUser[0] or the column name drdUser["COlumnName"]. Since I don't know the names of your
   // columns I will use numbers
   Console.WriteLine(String.Format("{0} {1} {2}", drdUser[0], drdUser[1], drdUser[2]);
}
drdUser.Close():

另外,我建议将SqlConnection的实例化包装到一个使用块中,这样一旦完成它就会被处理掉:

namespace ExecuteStoredProc
{
    class Program
    {
        static void Main(string[] args)
        {    
            //Instantiate and open the connection
            using(SqlConnection cnnUserMan = new SqlConnection("Your connection string")) 
            {
                cnnUserMan.Open();

                //Instantiate and initialize command
                using(SqlCommand cmmUser = new SqlCommand("SelectID", cnnUserMan))
                {
                    cmmUser.CommandType = System.Data.CommandType.StoredProcedure;

                    using(SqlDataReader drdUser = cmmUser.ExecuteReader())
                    {                     
                        while(drdUser.Read())
                        {
                            Console.WriteLine(String.Format("{0} {1} {2}", drdUser[0], drdUser[1], drdUser[2]);
                        }
                    }
                }
                Console.ReadLine();
            }
        }
    }
}

<强>更新

根据marc_s的评论,将所有一次性组件SqlConnection,SqlCommand和SqlDataReader包装在一个使用块中是有意义的,以确保它们被正确处理,而不是我的原始解决方案只包含SqlConnection和一个使用块

更新2

根据Thorarin的评论,将变量声明为using块的一部分看起来更清晰,特别是在这种情况下,你不需要每个using块之外的变量。

答案 1 :(得分:1)

此代码将显示存储过程返回的所有行:

static void Main(string[] args)
{
    // Instantiate the connection
    using (SqlConnection cnnUserMan = new SqlConnection("Data Source=.\\SQLEXPRESS;AttachDbFilename=c:\\Program Files\\Microsoft SQL Server\\MSSQL10.SQLEXPRESS\\MSSQL\\DATA\\UserDB.mdf; Integrated Security=True;Connect Timeout=30;User Instance=True"))
    using (SqlCommand cmmUser = cnnUserMan.CreateCommand())
    {
        // Initialize command
        cmmUser.CommandText = "SelectID";
        cmmUser.CommandType = CommandType.StoredProcedure;

        cnnUserMan.Open();

        using (SqlDataReader dr = cmmUser.ExecuteReader())
        {
            // Loop through returned rows
            while (dr.Read())
            {
                // Loop through all the returned columns
                // Printing column name and value
                for (int col = 0; col < dr.FieldCount; col++)
                {
                    Console.WriteLine(dr.GetName(col) + " = " + dr.GetValue(col));
                }
                Console.WriteLine();
            }
        }
    }

    Console.ReadLine();
}

我做了一些改变。您可能会注意到using语句的使用,该语句可确保正确处理SqlConnectionSqlDataReader对象。一旦完成,这将释放与数据库的连接。

有几种方法可以阅读您的信息,因此请查看SqlDataReader documentation on MSDN。或者,您可能希望使用更通用的IDataReader接口。

<强>更新
同时为using添加了SqlCommand语句,现在已使用CreateCommand进行实例化。现在,在打开连接之前创建了命令。

答案 2 :(得分:0)

您不能使用Console.WriteLine来显示DataTable,因为您必须使用Foreach / for循环扫描表格的每一行并逐个打印。

答案 3 :(得分:0)

您需要通过迭代ExecuteReader方法返回的DataReader并按行和逐行构建输出列来手动生成输出字符串。您可以创建一个通用类来为任何datareader输出执行此操作。