kiv*_*all 3 .net c# sql-server ado.net
我正在研究一个我需要稍微修改的程序.有一个SQL语句我不明白它的作用(或基本上它是如何做的).
string query = "SELECT dbo.BusinessMinutes(@start,@end,@priorityid)";
SqlCommand cmd = new SqlCommand(query, con);
cmd.Parameters.Add("@start", SqlDbType.DateTime).Value = start;
cmd.Parameters.Add("@end", SqlDbType.DateTime).Value = end;
cmd.Parameters.Add("@priorityid", SqlDbType.UniqueIdentifier).Value = priorityId;
SqlDataAdapter READER = new SqlDataAdapter();
READER.SelectCommand = cmd;
DataTable table = new DataTable();
READER.Fill(table);
if (table.Rows.Count == 1)
{
minutes = (int)table.Rows[0][0];
}
Run Code Online (Sandbox Code Playgroud)
那么有人可以解释那里的SELECT语句.最终结果(分钟)是预期的,所以它的工作原理,但语法混淆了我.这在某种程度上等于SELECT*FROM dbo.BusinessMinutes WHERE ...
这是常用的,这个语法有一些特殊的名称,所以我可以更好地命名我的问题?先感谢您.
dbo.BusinessMinutes 必须是UDF(用户定义函数),它根据开始日期,结束日期和优先级指示符返回简单的标量值.
标量函数(无论是UDF还是本机函数)可以在SELECT语句中用于在返回的结果集中生成字段.因此,您拥有的代码是完全合法的.
有关标量UDF的更多信息,请阅读此MSDN文章.
作为旁注,该代码的更好实现是:
string query = "SELECT dbo.BusinessMinutes(@start,@end,@priorityid)";
using (SqlCommand cmd = new SqlCommand(query, con))
{
cmd.Parameters.Add("@start", SqlDbType.DateTime).Value = start;
cmd.Parameters.Add("@end", SqlDbType.DateTime).Value = end;
cmd.Parameters.Add("@priorityid", SqlDbType.UniqueIdentifier).Value = priorityId;
// assuming connection is already open
using (SqlDataReader reader = cmd.ExecuteReader())
{
if (reader.Read()) minutes = reader.GetInt32(0);
}
}
Run Code Online (Sandbox Code Playgroud)
如果你想要的只是初始化minutes变量,使用SqlDataReader将比创建a SqlDataAdapter和a 更有效率和高效DataTable.这些using陈述还将确保您SqlCommand和SqlDataReader对象得到妥善处理.