2011-02-17 223 views
0

我是.NET新手,我必须编写执行存储过程并返回DataTable的函数。DataTable总是返回空值

我的SqlConnection已经初始化,并在调试器中运行时,我可以看到DataAdapter返回值,但我的DataTable是空的。

public DataTable ExecStoredProcedure(String spName, String uId) 
     { 
      DataTable dt = new DataTable(); 
      try 
      { 
       conn.Open(); 
       SqlCommand cmd = new SqlCommand(spName, conn); 
       cmd.CommandType = CommandType.StoredProcedure; 
       cmd.Parameters.AddWithValue("@UnitIDList", uId); 
       SqlDataAdapter da = new SqlDataAdapter(cmd); 
       da.Fill(dt); 
      } 
      catch (SqlException ex) 
      { 
       throw new Exception(ex.StackTrace + ex.Message); 
      } 
      finally 
      { 
       conn.Close(); 
      } 

      return dt; 
     } 

请帮忙。

+1

尝试使用事件探查器查找SQL服务器在SQL服务器上执行的操作,并查看它是否真的返回任何结果。也许你会在那里找到一些东西。 – decyclone 2011-02-17 10:19:12

回答

1

我看不出这个代码有什么问题,我用我自己的sproc自己运行它。似乎很好。

当你踩通在调试你的代码,你会得到这样的行:

da.Fill(dt); 

让那么它运行在执行下一行之前检查dt.Rows.Count值在WatchImmediate窗口。报告的数字是多少?

如果dt.Rows.Count > 0那么你需要检查你在哪些代码中使用从你的方法得到的DataTable - 这就是问题所在。

如果dt.Rows.Count ==0那么它不会从Stored proc返回任何数据 - (这似乎不是您的问题),您需要查看sproc中的SQL。看看并发布你找到的...

1

我有同样的问题,SqlDataAdapter返回一个空的DataTable作为一个结果,但在我的情况下,原因是我有两个参数(“CheckDate1”和“CheckDate2”,存储过程是而不是我的btw。)声明为SqlDbType.DateTime类型。然而,有人非常聪明地将它们定义为我在开始时忽略的VARCHAR(10)

不幸的是,这并没有导致错误信息,只是在返回的空结果集中。只要我改变参数类型,我得到了我的预期结果。

希望这可能对别人有帮助。

G.