不能在列(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

不能在列(SQL-Server)中插入值NULL

您没有将这些列中的任何一列标记为"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值应该出现在这里,以便进一步研究。