Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/335.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将sp_MSForEachTable与SqlDataReader一起使用_C#_Sql Server - Fatal编程技术网

C# 将sp_MSForEachTable与SqlDataReader一起使用

C# 将sp_MSForEachTable与SqlDataReader一起使用,c#,sql-server,C#,Sql Server,我试图编写一个函数来获取数据库中表的大小。我知道sp_MSForEachTable的注意事项,但我认为这是一个合适的用法。这是我目前的代码: SqlCommand dbTableSizes = new SqlCommand("sp_MSForEachTable", Conn); dbTableSizes.Parameters.AddWithValue("@command1", "'exec sp_spaceused \"?\"'");

我试图编写一个函数来获取数据库中表的大小。我知道sp_MSForEachTable的注意事项,但我认为这是一个合适的用法。这是我目前的代码:

            SqlCommand dbTableSizes = new SqlCommand("sp_MSForEachTable", Conn);
            dbTableSizes.Parameters.AddWithValue("@command1", "'exec sp_spaceused \"?\"'");
            dbTableSizes.CommandType = CommandType.StoredProcedure;

            SqlDataReader dbTableSizeReader = dbTableSizes.ExecuteReader();

但是,每个表都有一个“不正确的语法”异常。括号和引号位于正确的位置,
exec sp_MSForEachTable“exec sp_spaceused”?“
在SSMS中运行时有效(如预期)。那么到底发生了什么?感谢您的帮助。

这在拨打sp\u MSforeachtable时起到了作用:

SqlCommand command = new SqlCommand("sp_MSforeachtable @command1='EXEC sp_spaceused ''?'''", con);
con.Open();
using (SqlDataReader dr = command.ExecuteReader())
{
  while (dr.Read())
  {
   
    Console.Writeline("Name: " + dr.GetString(0));
    Console.Writeline("Rows: " + dr.GetString(1));
    Console.Writeline("Reserved: " + dr.GetString(2));
    Console.Writeline("Data: " + dr.GetString(3));
    Console.Writeline("IndexSize: " + dr.GetString(4));
    Console.Writeline("Unused: " + dr.GetString(5));
   dr.NextResult();
  }
}

参数本身的值为
exec sp_spaceused”?“
;单引号仅在作为语句的一部分传递时分隔文字。(请注意,由于
spmsforeachtable
返回多个结果集,因此需要
.NextResult
以及
.Read
,这是不寻常的。)谢谢。我错过了。既然这只是幕后的一个光标,为什么不自己滚动一下呢?代码中使用的未记录的过程总是一触即发的。我按顺序为一堆数据库运行这个过程(这可能会在以后的更多数据库中重复),我不想为每个数据库设置新的SP。我也不想在我的应用程序之间有太多的来回,担心它看起来会很混乱。也许我对这些事情没有理性。:)但是谢谢你的评论。如果有一个链接,你可以提供参考,我会很高兴地学习。