C# SQL Server输出参数返回的结果好坏参半
**编辑***************** 我从GETDATE()更改为SYSDATETIME()。 我还将测量值从毫秒改为微秒。处理速度如此之快,以至于毫秒无法测量C# SQL Server输出参数返回的结果好坏参半,c#,sql-server,vb.net,stored-procedures,query-parameters,C#,Sql Server,Vb.net,Stored Procedures,Query Parameters,**编辑***************** 我从GETDATE()更改为SYSDATETIME()。 我还将测量值从毫秒改为微秒。处理速度如此之快,以至于毫秒无法测量 我使用这段代码的目的是计算传递到存储过程中的查询字符串的处理时间。查询字符串由用户创建,该用户是一名修读sql/数据库课程的学生。在随后的查询中,将字符串与键进行比较,以确定它是否为赋值生成正确的结果。正如您将看到的,是VB.NET代码(.NET 4.5项目)调用调用存储过程的C#方法(.NET 3.5项目)(SQL SERVE
我使用这段代码的目的是计算传递到存储过程中的查询字符串的处理时间。查询字符串由用户创建,该用户是一名修读sql/数据库课程的学生。在随后的查询中,将字符串与键进行比较,以确定它是否为赋值生成正确的结果。正如您将看到的,是VB.NET代码(.NET 4.5项目)调用调用存储过程的C#方法(.NET 3.5项目)(SQL SERVER 2012) 我从主计划项目的第一个电话是: 调用的方法在这里: 我的存储过程在这里: 当查询字符串正确时,结果为0。如果字符串不正确,则返回1.4到2.5秒之间的值 这是我第一次使用带有输出参数的存储过程。我没想到它会如此具有挑战性 我是否忽略了一个简单的细节,使这项工作正常?我已经在这里尝试了至少五到六个关于堆栈溢出的例子——以及其他几个网站。您在这里看到的是我的最新迭代。如果你需要更多的信息,请告诉我
如果你知道更好的方法,我愿意接受任何建议。你的结果可能是正确的。如果SQL SERVER版本为2008或更高版本,请使用SYSDATETIME()而不是GETDATE(),因为它具有更高的准确性(或分辨率)。否则,您可以尝试多次运行查询字符串,然后将结果除以运行次数。应该放弃格式错误的查询字符串的执行时间。为什么不在C代码中计时调用,而使用秒表而不是SQL中的out参数?这是我最初的建议,但我被要求在存储过程中执行。天哪,老兄!更改为SYSDATETIME()时,我得到了第一个非0响应。是13毫秒。而且,你说得很好。通过声明它可能是正确的,你给了我一个想法,将我的度量值从毫秒改为微秒。果不其然,它发生得如此之快,以至于我无法在毫秒内测量它。感谢你结束了几个小时的痛苦和痛苦:-)很乐意帮忙。但是,请注意,您的代码容易受到SQL注入的影响。您至少需要将用户输入包装到事务中,并在测量执行时间后回滚。考虑一下“删除事务”之类的查询可能对数据库造成的影响!在将字符串提交到存储过程进行处理之前,将对其进行彻底分析。这是一个面向学生的系统,因此将他们的输入作为查询字符串处理是一个必要的缺点。
Dim executionTime As Integer = exercise.GetSqlTime(txtUserSQL, connectionString)
public int GetSqlTime(string SqlString, string ConnectionString)//bookmark
{
int executionTime = 0;
SqlConnection con = new SqlConnection(ConnectionString);
using (SqlCommand cmd = new SqlCommand("QueryExecutionTime", con))
{
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.Add("@UserSQLstring", SqlDbType.NVarChar).Value = SqlString;
cmd.Parameters.Add("@Duration", SqlDbType.Int);
cmd.Parameters["@Duration"].Direction = ParameterDirection.Output;
con.Open();
cmd.ExecuteNonQuery();
con.Close();
executionTime = Convert.ToInt32(cmd.Parameters["@Duration"].Value);
}
return executionTime;
}
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[QueryExecutionTime]
@UserSQLstring NvarChar(3000),
@Duration int OUTPUT
AS
BEGIN
SET NOCOUNT ON;
DECLARE @StartTime datetime = GETDATE()
EXEC sp_executesql @UserSQLstring
DECLARE @EndTime datetime = GETDATE()
SET @Duration = DATEDIFF(MILLISECOND,@StartTime,@EndTime)
END