我正在努力了解如何将存储过程与应用程序连接起来。我的示例很简单,但它不会在命令提示符中显示我的列和行,而是显示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();
}
}
}
感谢。
答案 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
语句的使用,该语句可确保正确处理SqlConnection
和SqlDataReader
对象。一旦完成,这将释放与数据库的连接。
有几种方法可以阅读您的信息,因此请查看SqlDataReader documentation on MSDN。或者,您可能希望使用更通用的IDataReader
接口。
<强>更新强>:
同时为using
添加了SqlCommand
语句,现在已使用CreateCommand
进行实例化。现在,在打开连接之前创建了命令。
答案 2 :(得分:0)
您不能使用Console.WriteLine来显示DataTable,因为您必须使用Foreach / for循环扫描表格的每一行并逐个打印。
答案 3 :(得分:0)
您需要通过迭代ExecuteReader方法返回的DataReader并按行和逐行构建输出列来手动生成输出字符串。您可以创建一个通用类来为任何datareader输出执行此操作。