2017-05-08 4 views
1

C# ASP.NET 응용 프로그램 (MVC 3)에서 SQL Server 2014 저장 프로 시저를 실행하는 동안 문제가 있습니다. 동일한 매개 변수를 사용하여이 절차를 수동으로 실행하면 모든 적절한 결과를 반환합니다. 프로 시저가 C# 응용 프로그램에서 실행되면 "판독기"는 데이터없이 비어 있습니다. DateTime 형식의 문제 인 것 같습니다. 문제를 해결하려면 어떻게해야합니까?StoredProcedure에서 DateTime 형식 문제 - C# ASP.NET x MS SQL Server 2014

SQL :

ALTER PROCEDURE [dbo].[my_proc] 
(
    @client_code AS varchar(7), 
    @begin_date AS datetime, 
    @end_date AS datetime 
) 
AS 
BEGIN 
    SET NOCOUNT ON; 


SELECT * 
    from [dbo].[my_table] c 
    WHERE c.code = @client_code 
    AND c.date1 >= @begin_date 
    AND c.date2 <= @end_date 

END 

C 번호 :

DateTime Today = DateTime.Today; 
DateTime LastYear = Today.AddYears(-1); 
sql = new SqlConnection(/*my string connection*/); 
sql.Open(); 
adapter.SelectCommand = new SqlCommand(); 
adapter.SelectCommand.CommandText = "dbo.my_proc"; 
adapter.SelectCommand.Connection = sql; 
adapter.SelectCommand.CommandType = CommandType.StoredProcedure; 

param1 = adapter.SelectCommand.Parameters.Add("@client_code", SqlDbType.VarChar); 
param1.Value = cod_client; 

param2 = adapter.SelectCommand.Parameters.Add("@begin_date", SqlDbType.Date); 
param2.Value = LastYear.ToString("yyyy-MM-dd"); 

param3 = adapter.SelectCommand.Parameters.Add("@end_date", SqlDbType.Date); 
param3.Value = Today.ToString("yyyy-MM-dd"); 

reader = adapter.SelectCommand.ExecuteReader(); 
+1

'로 .toString ("...")':

param2 = adapter.SelectCommand.Parameters.Add("@begin_date", SqlDbType.Date); param2.Value = LastYear.Date; param3 = adapter.SelectCommand.Parameters.Add("@end_date", SqlDbType.Date); param3.Value = Today.Date; 

+0

DateTime 유형의 매개 변수가 필요합니다. 왜 완벽하게 맞는 datetime 변수를 문자열로 변환합니까? – Steve

+0

C#과 SQL Server의 datetime 형식이 일치하지 않아서 toString 메서드를 통해 형식을 관리하려고했습니다. –

답변

1

당신은 문자열로 DateTime을 변환하지 말아야 다음은 코드입니다. 그냥 "있는 그대로"저장 프로 시저에 전달하십시오. 날짜 부분을 원하면 Date을 사용하십시오. 데이터 유형을 변경하지 마십시오.

 adapter.SelectCommand.Parameters.AddWithValue("@client_code", cod_client); 
     adapter.SelectCommand.Parameters.AddWithValue("@begin_date", LastYear.Date); 
     adapter.SelectCommand.Parameters.AddWithValue("@end_date", Today.Date); 
+0

나는이 방법을 시도했지만 아직 예상대로 작동하지 않습니다. datetime 형식 불일치가 두렵습니다. –

+0

저는 오랫동안이 방법을 사용하고 있습니다. 뭐가 잘못 됐는지 설명해 주시겠습니까? – David

+0

C# 응용 프로그램에서 실행하면 절차가 비어있게됩니다. 그러나 동일한 매개 변수를 사용하여 SQL Server에서 직접 프로 시저를 직접 실행하면 모든 적절한 행이 반환됩니다. –

0

는 AddWithValue 방법 느릅 나무가 덜 장황하고 즉석에서 매개 변수의 데이터 유형을 식별 할 수있는 시도? 아니, 문제가 생길거야. 시간 부분을 없애려면`SqlDbType.DateTime`을 사용하고`Today.Date`를 사용하십시오.
+1

이것은 루트 문제 (날짜 값을 텍스트로 전송)와 가장 중요한 [AddWithValue는 어쨌든 나쁜 습관입니다] (http : // 와일드 카드) 날짜를 캐스팅하지 않음 (날짜로 c.date1) /blogs.msmvps.com/jcoehoorn/blog/2014/05/12/can-we-stop-using-addwithvalue-already/). – Alejandro