我正在嘗試使用存儲過程從SQL Server 2008 R2數據庫查詢數據。代碼執行時沒有錯誤,但沒有從查詢返回結果。當通過SQL Server Management Studio使用完全相同的參數調用相同的存儲過程時,數據將正確返回。我不知道什麼可能會導致這種情況,可能是SqlClient實現的特定情況?查詢返回兩個DateTime2
值之間的所有數據;如果我使這些值分開足夠遠,則會返回數據。顯然這不是理想的行爲。SQL查詢和SqlClient操作之間的區別
C#代碼(startTime.HasValue
和endTime.HasValue
在這種情況下是true):
if (conn.State == ConnectionState.Closed)
{
conn.Open();
}
SqlCommand comm = conn.CreateCommand();
comm.CommandType = CommandType.StoredProcedure;
comm.CommandText = "GetAllPropertyValues";
comm.Parameters.Add("@dataTypeName", SqlDbType.NVarChar).Value = dataTypeName;
comm.Parameters.Add("@propertyName", SqlDbType.NVarChar).Value = propertyName;
if (startTime.HasValue)
{
var startString = startTime.Value.ToUniversalTime().ToString("O");
if (endTime.HasValue)
{
var endString = endTime.Value.ToUniversalTime().ToString("O");
comm.CommandText += "Between";
comm.Parameters.Add("@startTime", SqlDbType.DateTime2).Value = startString;
comm.Parameters.Add("@endTime", SqlDbType.DateTime2).Value = endString;
}
else
{
comm.CommandText += "After";
comm.Parameters.Add("@dateTime", SqlDbType.DateTime2).Value = startString;
}
}
SqlDataReader reader = comm.ExecuteReader();
while (reader.Read())
{
// ...
}
SQL Server存儲過程:
declare @str varchar(max) = 'select * from [dbo].[' + @tableName + '] where StartTime BETWEEN ''' +
CAST(@startTime as nvarchar(max)) + ''' AND ''' + CAST(@endTime as nvarchar(max)) + ''' order by StartTime asc'
exec(@str)
執行的示例性查詢:
USE [Construct3]
GO
DECLARE @return_value int
EXEC @return_value = [dbo].[GetAllPropertyValuesBetween]
@datatypeName = N'HeadPose',
@propertyName = N'HeadRotationRadiansZ',
@startTime = '2014-12-31T19:00:00.0000000Z',
@endTime = '2014-12-31T20:00:00.0000000Z'
SELECT 'Return Value' = @return_value
GO
您是否試過閱讀此文? http://stackoverflow.com/questions/1314505/why-some-stored-procedures-do-not-return-data-in-asp-net-c-sharp – Nothing
你運行SQL跟蹤來查看實際對服務器執行的語句? – AgustinCoder