0

我已经搜索过这个问题的答案,但我发现没有一个真正有帮助。我有一个将数据写入表的存储过程。插入包含一个 DateTime 字段,但根据输入的数据,该字段可以为空。我的经典 ASP 页面中的代码类似于以下内容:

If Request.Form("Status") = "Closed" Then
Status = "Closed"
DateClosed = Now()

Else

Status = "OPEN"
DateClosed = NULL

End If

SP_AddToTable = "MyTable '" & Status & "', '" & DateClosed & "'"

Set SQLQuery = objConn.Execute(SP_AddToTable)

存储过程如下所示:

USE [MyDatabase]
GO
/****** Object:  StoredProcedure [dbo].[SP_AddToTable] Script Date: 04/30/2013         10:00:10 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

ALTER PROCEDURE [dbo].[SP_AddToTable] 

@Status varchar(20),
@DateClosed datetime

AS

INSERT INTO MyTable (
[Status],
DateClosed,
)

VALUES (
@Status,
@DateClosed)

如果我传递一个实际的日期值,它可以正常工作,但是如果传递了 NULL 值,或者如果我没有将任何数据传递给 DateClosed 字段,那么该字段默认为 1900 年 1 月 1 日。我需要做什么(要么在我的 ASP 代码或存储过程中)将 DateClosed 字段在表中留空?

我对存储过程很陌生,所以请原谅任何初学者的错误。:)

谢谢。

4

1 回答 1

1

首先,您需要更改您的 ASP 代码以使用参数化查询调用 sp ——您上面的查询极易受到 SQL 注入的攻击:

Set cmd = Server.CreateObject("ADODB.Command")
cmd.ActiveConnection = objConn
cmd.CommandText = "SP_AddToTable"
cmd.CommandType = adCmdStoredProc
cmd.Parameters.Refresh

cmd.Parameters(1) = Status 
cmd.Parameters(2) = DateClosed 
cmd.Execute

这也应该像您插入值“NULL”(带单引号)之前一样解决您的空问题。

于 2013-04-30T14:27:33.190 回答