Хранимая процедура LINQ DATETIME NULL - PullRequest
0 голосов
/ 12 февраля 2010

Я получил это сообщение об ошибке, когда использую Linq и хранимую процедуру следующим образом. Я получил это сообщение, когда параметр DateTime имеет значение NULL. Как мне это решить?

ErrorMessage Serverfel i tämpningsprogrammet. SqlDateTime-spill: Det måste vara mellan 01.01.1753 12:00:00 och 31.12.999 11:59:59.

Кодовый блок в C #

protected void ButtonSearch_Click(object sender, EventArgs e)
{
    Postit p = new Postit(); 
    DateTime? dt;

    if(TextBoxDate.Text=="")
    {
        dt=null;
    }
    else
    {
        dt=System.Convert.ToDateTime(TextBoxDate.Text);
    }

    GridView1.DataSource = p.SearchPostit(TextBoxMessage.Text, TextBoxWriter.Text, TextBoxMailto.Text, System.Convert.ToDateTime(dt));  
    GridView1.DataBind();
}



public ISingleResult<Entities.SearchPostitResult> SearchPostit([Parameter
(DbType="VarChar(1000)")] string message, [Parameter(DbType="VarChar(50)")] string writer, [Parameter(DbType="VarChar(100)")] string mailto, [Parameter(DbType="DateTime")] System.Nullable<System.DateTime> date)
{           
IExecuteResult result = this.ExecuteMethodCall(this, ((MethodInfo)(MethodInfo.GetCurrentMethod())), message, writer, mailto, date);

return ((ISingleResult<Entities.SearchPostitResult>)(result.ReturnValue));

Procedure
ALTER PROCEDURE [dbo].[SearchPostit]
    (
    @message varchar(1000)='', 
    @writer varchar(50)='',
    @mailto varchar(100)='',
    @date Datetime=null
    )
AS
    SELECT P.Message AS Postit, P.Mailto AS 'Mailad till', P.[Date] AS Datum , U.UserName AS Användare  
    FROM PostIt P   

    INNER JOIN [User] U ON P.UserId=U.UserId

        WHERE   P.message LIKE '%'+@message+'%' 
AND     P.Mailto LIKE '%'+@mailto+'%'  
AND     (
                @date IS NULL 
            OR  P.Date = @date
        )
AND     U.UserName LIKE '%'+@writer+'%'
    GROUP BY P.Message, P.Mailto, P.[Date], U.UserName
}

Ответы [ 3 ]

1 голос
/ 16 декабря 2010

Вы должны использовать:

SqlDateTime.MinValue.Value 

Вместо:

new DateTime(1753,01,01).
0 голосов
/ 12 февраля 2010
ALTER PROCEDURE [dbo].[SearchPostit]
    (
    @message varchar(1000)='', 
    @writer varchar(50)='',
    @mailto varchar(100)='',
    @date Datetime=null
    )
AS
    SELECT P.Message AS Postit, P.Mailto AS 'Mailad till', P.[Date] AS Datum , U.UserName AS Användare  
    FROM PostIt P   

    INNER JOIN [User] U ON P.UserId=U.UserId

        WHERE   P.message LIKE '%'+@message+'%' 
AND     P.Mailto LIKE '%'+@mailto+'%'  
AND     ISNULL(@Date, 0) IN (P.Date, 0)
AND     U.UserName LIKE '%'+@writer+'%'
    GROUP BY P.Message, P.Mailto, P.[Date], U.UserName
}
0 голосов
/ 12 февраля 2010

Присваивая NULL дате и времени

if(TextBoxDate.Text=="")
{
    dt=null;
}

ваш оператор преобразования не удастся

System.Convert.ToDateTime(dt)

Я не уверен, но я думаю, что используется значение по умолчанию для datetime ("0001/01/01"), следовательно, запрос не будет выполнен, поскольку эта дата не попадает между

1/1/1753 12:00:00 AM och 12/31/9999

Я предлагаю вам назначить минимальную дату для "dt", если дата не введена из пользовательского интерфейса

if(TextBoxDate.Text=="")
{
    dt= new DateTime(1753,01,01);
}

[EDIT]

Все, что вам нужно сделать, это удалить избыточный оператор Convert при вызове сохраненного Процедура

    GridView1.DataSource = p.SearchPostit(TextBoxMessage.Text, 
       TextBoxWriter.Text, TextBoxMailto.Text, dt);  

это избыточно, поскольку вы уже объявили dt как DateTime?.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...