DataTable始终返回0

时间:2015-12-17 14:46:29

标签: c#

我的查询返回结果,但由于某种原因,我的DataTable总是显示0.我改变的唯一事实是我在C#语法中添加了参数(尽管如果我手动运行存储过程它会返回结果)。这是我的语法,有没有人在语法上看到不正确的东西?

protected void btnPress1464()
{
    RunSQLStoredProc();
    DataTable tableA = ebdb.Tables[0];
    if (this.dtgAttendanceTracker.Items.Count == 0)
    {
        this.gvwTest.DataSource = tableA
        this.gvwTest.DataBind();
    }
}

public DataSet RunSQLStoredProc()
{
    ebdb = new DataSet(); 
    SqlQueryBuilder = new StringBuilder();
    SqlQueryBuilder.Append("exec alphadawg ");
    ebdb = DoThis(SqlQueryBuilder.ToString());
    return ebdb;
}

public DataSet DoThis(string sqlQuery, int employeeid, DateTime hiredate, DateTime terminationdate)
{
    try
    {
        System.Configuration.ConnectionStringSettings connstring = System.Configuration.ConfigurationManager.ConnectionStrings["SQLServer1"];

        using (SqlConnection conn = new SqlConnection(connstring.ConnectionString))
        {
            using (SqlCommand cmd = new SqlCommand())
            {
                cmd.CommandText = sqlQuery;
                cmd.Connection = conn;
                cmd.CommandType = CommandType.StoredProcedure;
                cmd.Parameters.AddWithValue("@employeeid", employeeid.ToString());
                cmd.Parameters.AddWithValue("@hiredate", hiredate.ToShortDateString());
                cmd.Parameters.AddWithValue("@terminationdate", terminationdate.ToShortDateString());
                conn.Open();
                SqlDataAdapter adapter = new SqlDataAdapter(cmd);                    
                adapter.Fill(ebdb);
                conn.Close();
            }                
        }
        return ebdb;
    }
    catch (Exception exception) { throw exception; }
}

1 个答案:

答案 0 :(得分:4)

CommandText只应包含存储过程名称,如果命令execCommandType,则StoredProcedure也不应包含StringBuilderAddWithValue也是多余的。

我也认为你使用错误类型SqlQueryBuilder = new StringBuilder(); SqlQueryBuilder.Append("exec alphadawg "); ebdb = DoThis(SqlQueryBuilder.ToString()); 的方式可能导致这个问题(请看我的答案的最后一段):

所以不是

ebdb = DoThis("alphadawg", otherParamaters...);

DoThis

将sql-string传递给执行它的方法也是不好的做法,这通常会引入sql注入问题。你不应该有一个方法GetAlphaDawg而是DataSet,它封装了sql-query并且只传递参数值。

除此之外,为什么如果某个方法实际上是您所返回的某个字段,则会从方法返回AddWithValue?而是在方法中初始化并填充它,更加清晰,并且还可以在加载已填充的数据集时防止出现问题(默认情况下将附加数据)。

这可能是一种实施方式。请注意,您不应该使用String并且不要DateTime使用AddWithValue,但始终使用正确的类型,如果你使用public DataSet GetAlphaDawg(int employeeid, DateTime hiredate, DateTime terminationdate) { DataSet dsAlpha = new DataSet(); try { System.Configuration.ConnectionStringSettings connstring = System.Configuration.ConfigurationManager.ConnectionStrings["SQLServer1"]; using (var conn = new SqlConnection(connstring.ConnectionString)) { using (var da = new SqlDataAdapter("alphadawg", conn)) { da.SelectCommand.CommandType = CommandType.StoredProcedure; var parameter = da.SelectCommand.Parameters; parameter.Add("@employeeid", SqlDbType.Int).Value = employeeid; parameter.Add("@hiredate", SqlDbType.Date).Value = hiredate; parameter.Add("@terminationdate", SqlDbType.Date).Value = terminationdate; da.Fill(dsAlpha); // Open/Close not needed with Fill return dsAlpha; } } } catch (Exception) { throw; } } 需要从值中推断出类型:

ToShortDateString

由于您使用DateTime,如果您确实要删除DateTime.Date使用parameter.Add("@hiredate", SqlDbType.Date).Value = hiredate.Date; 的时间部分,例如:

{{1}}