不能在列(SQL-Server)中插入值NULL
本文关键字:插入 NULL SQL-Server 不能 | 更新日期: 2023-09-27 18:12:30
我创建了一个存储过程来将数据输入到数据库中。数据从asp:文本框输入,然后解析为.cs文件中的类和方法。然而,当运行时,我给出了以下错误。不能将值NULL插入列
add_question.aspx.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using Devworks;
namespace OSQARv0._1
{
public partial class WebForm2 : System.Web.UI.Page
{
OscarSQL b;
protected void Page_Load(object sender, EventArgs e)
{
string QuestionnaireName = (string)Session["QuestionnaireName"];
int QuestionnaireID = (int)Session["QuestionnaireID"];
ReturnQnrName.Text = QuestionnaireName + " (ID: " + QuestionnaireID.ToString() + ")";
}
protected void FinishQnrButton_Click(object sender, EventArgs e)
{
b = new OscarSQL();
int testRetn = b.InsertQuestions(QuestionName.Text, Int32.Parse(QuestnType.SelectedValue), Int32.Parse(QuestionnaireID.Text));
int QuestionID = (int)Session["QuestionID"];
testlabel.Text = QuestionID.ToString();
} // End NewQNRButton_Click
} // End WebForm2
} // End new_questionnaire
OscarSQL.cs
using System;
using System.Collections.Generic;
using System.Text;
using System.Data.SqlClient;
using System.Data;
namespace Devworks
{
public class OscarSQL
{
private string _productConnectionString;
private SqlConnection _productConn;
public OscarSQL()
{
_productConn = new SqlConnection();
_productConnectionString += "data source=mssql.database.co.uk; Initial Catalog=devworks_oscar;User ID=username;Password=password";
_productConn.ConnectionString = _productConnectionString;
}
public int InsertQuestions(string QuestionName, int QuestionType, int QuestionnaireID)
{
int retnVal = 0;
SqlCommand myCommand = new SqlCommand("NewQuestion", _productConn);
myCommand.CommandType = CommandType.StoredProcedure;
myCommand.Parameters.Add(new SqlParameter("@QUESTIONNAME", SqlDbType.NVarChar));
myCommand.Parameters.Add(new SqlParameter("@QUESTIONTYPE", SqlDbType.Int));
myCommand.Parameters.Add(new SqlParameter("@QUESTID", SqlDbType.Int));
myCommand.Parameters.Add("@QUESTION_ID", SqlDbType.Int, 0, "QUESTION_ID");
myCommand.Parameters["@QUESTION_ID"].Direction = ParameterDirection.Output;
myCommand.Parameters[0].Value = QuestionName;
myCommand.Parameters[1].Value = QuestionType;
myCommand.Parameters[2].Value = QuestionnaireID;
_productConn.Open();
myCommand.ExecuteNonQuery();
retnVal = (int)myCommand.Parameters["@QUESTION_ID"].Value;
_productConn.Close();
return retnVal;
}
private void insert(SqlCommand myCommand)
{
_productConn.Open();
myCommand.ExecuteNonQuery();
_productConn.Close();
}
}
}
存储Prodcedure USE [devworks_oscar]
GO
/****** Object: StoredProcedure [hgomez].[NewQuestion] Script Date: 10/27/2011 17:10:12 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [hgomez].[NewQuestion]
(
@QUESTIONNAME nvarchar(50),
@QUESTIONTYPE int,
@QUESTID int,
@QUESTION_ID int OUTPUT
)
AS
/* SET NOCOUNT ON */
INSERT INTO [Questions] (QuestionText, QuestionType, QuestionnaireID) VALUES (@QUESTIONNAME, @QUESTIONTYPE, @QUESTID)
SET @QUESTION_ID = SCOPE_IDENTITY();
RETURN
您没有将这些列中的任何一列标记为"Allow null "。因此你得到了上面的错误。检查您在"QuestionText","QuestionType"或"QuestionnaireID"中插入的值是否为空,并且该列未标记为"Allow null"。
它也可以是同一表中未标记为"Allow Null"的其他列,并且您没有插入任何值,因此默认情况下它试图插入Null
运行分析器。您正在为需要具有a值的某些列发送Null值。无论如何,您都希望看到正在生成的SQl,以查看是什么导致了问题。
假设确切的错误消息是"Cannot insert the value NULL into column",并且您不知道哪个列是空的。要找出试图将哪个列插入为空,首先创建一个表来捕获错误:
CREATE TABLE Errors (QuestionName NVARCHAR(50), QuestionType INT, QuestId INT, ErrorMessage NVARCHAR(4000), ErrorTime datetime default getdate())
接下来,在存储过程中添加Try/Catch:
<>之前开始试一试/*在*/上设置nocountINSERT INTO [Questions] (QuestionText, QuestionType, QuestionnaireID) VALUES (@QUESTIONNAME, @QUESTIONTYPE, @QUESTID)设置@question_id = scope_identity ();返回最后试一试开始抓INSERT Errors (QuestionName,QuestionType, QuestId, ErrorMessage)Select @questionname, @questiontype, @questid, error_message ();最终赶上之前从现在开始,这个存储过程中的错误将被记录到errors表中。NULL值应该出现在这里,以便进一步研究。