我的查询返回结果,但由于某种原因,我的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; }
}
答案 0 :(得分:4)
CommandText
只应包含存储过程名称,如果命令exec
为CommandType
,则StoredProcedure
也不应包含StringBuilder
。 AddWithValue
也是多余的。
我也认为你使用错误类型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}}