VARCHAR(1)等效于C#land,SQL INSERT ERROR

时间:2013-01-31 22:07:12

标签: c# sql sql-server ajax asp.net-mvc-4

我正在构建一个将API插入Microsoft SQL Server数据库的Web API。

此API最终用法将在JAVA Spring应用程序中。

我不想把“马车放在马前”,所以作为POC,我想先向自己证明我可以从一个简单的网页上调用我的Web API。

基本上,我的简单网页有一些文本输入字段,当我点击一个按钮时,我验证文本字段,然后从中创建一个JSON字符串。接下来我有一个Ajax调用,它将这个JSON字符串传递给我的控制器。我在.NET环境中的控制器收到我的请求,但是会出现以下错误 -

  

发生错误。“,”ExceptionMessage“:”字符串或二进制数据将被截断。

随后是堆栈跟踪。

  

在System.Data.SqlClient.SqlInternalConnection.OnError ... blah blah

我认为问题在于我试图插入的几个列。

它们的类型为VARCHAR(1),并且在SQL Server中具有NOT NULL属性。

在我的简单网页上,我从未为这些值创建文本输入。相反,我认为当我在服务器上执行实际的INSERT时,我可以坚持使用这些值。顺便说一句,我使用TableAdapter来处理我的所有数据库连接......等等。

使所有这一切发生的代码如下:

//JQUERY - collecting the input and generating the JSON
$('#pythonIsActive').is(':checked') ? activeCourse = 'Y' : activeCourse = 'N';  
        $('#pythonRequiresSecurityClearance').is(':checked') ? clearanceRequired = 'Y' : clearanceRequired = 'N';
        $('#pythonOfferedFall').is(':checked') ? fall = 'Y' : fall = 'N';
        $('#pythonOfferedWinter').is(':checked') ? winter = 'Y' : winter = 'N';
        $('#pythonOfferedSpring').is(':checked') ? spring = 'Y' : spring = 'N';
        $('#pythonOfferedSummer').is(':checked') ? summer = 'Y' : summer = 'N';
        $('#pythonIsTentative').is(':checked') ? tenativeCourse = 'Y' : tenativeCourse = 'N';

        var Course = {
            CourseID: $('#pythonCourseId').val(),
            CourseLongName: $('#pythonLongName').val(),
            IsActiveCourse: activeCourse,
            Description: $('#pythonCourseDescription').val(),
            DepartmentID: $('#pythonDepartmentId').val(),
            LabHours: $('#pythonLabHours').val(),
            LectureHours: $('#pythonLectureHours').val(),
            CourseShortName: $('#pythonShortName').val(),
            EffectiveYear: $('#pythonEffectiveYear').val(),
            EffectiveQuarter: $('#pythonEffectiveQuarter').val(),
            IsClearanceRequired: $('#pythonRequiresSecurityClearance').val(),
            ClearanceRequired: $('#pythonSecurityClearanceRequired').val(),
            CourseCoordinatorID: $('#pythonCoordinatorID').val(),
            IsOfferedQ1: fall,
            IsOfferedQ2: winter,
            IsOfferedQ3: spring,
            IsOfferedQ4: summer,
            Prerequisite1: $('#pythonPrerequisite1').val(),
            Prerequisite2: $('#pythonPrerequisite2').val(),
            Prerequisite3: $('#pythonPrerequisite3').val(),
            IsTentative: tenativeCourse,
            Prerequisites: $('#pythonPrerequisites').val()
        };
        courseDataToPost = JSON.stringify(Course);
        return courseDataToPost;

接下来,我将把这个JSON字符串传递给我的AJAX CALL,就像这样 -

$.ajax({
    type: "POST",
    url: "/api/courses",
    cache: false,
    contentType: "application/json; charset=utf-8",
    async: true,
    data: dataToPost,
    dataType: "json",
    success: function () {
      alert("Success!");
    },
    error: function (x, e) {
      alert("The call to the server side FAILED. " + x.responseText);
    }
});

因此,这成功地将请求路由到正确的控制器方法 -

    // POST /api/courses
    [HttpPost]
    public void Post(pythonCourse course)
    {
        var postTableAdapter = new tnpCourseTableAdapter();
        decimal zero = 0;
        string no = "N";

        try
        {
            postTableAdapter.Insert(course.CourseID, course.CourseLongName, 
                                    course.IsActiveCourse, course.Description,
                                    course.DepartmentID, course.LabHours, 
                                    course.LectureHours, course.CourseShortName,
                                    course.EffectiveYear, course.EffectiveQuarter, 
                                    course.IsClearanceRequired,
                                    course.ClearanceRequired, 
                                    course.CourseCoordinatorID, course.IsOfferedQ1,
                                    course.IsOfferedQ2, course.IsOfferedQ3, 
                                    course.IsOfferedQ4, course.Prerequisite1,
                                    course.Prerequisite2, course.Prerequisite3, 
                                    course.IsTentative, zero, zero, null,
                                    no, no, no, null, null, null, null);
        }
        catch (Exception)
        {
            throw;
        }            
    }            

当我到达服务器代码时,调试器在catch块上停止并给出“String或binary data ...”错误。

请注意我在参数列表中传递了3个字符串no的实例。

这些参数是字符串,但SQL Server期待VARCHAR(1)

这是导致我悲伤的原因,还是还有其他事情发生?

1 个答案:

答案 0 :(得分:3)

此错误表示您在列中放入了太多数据。您的列需要单个字符串。

因此,错误意味着您将no放入列中......它将被截断为n

另一个例子:如果列是VARCHAR(5)并且您插入了“Hello World!”,则会警告它只能插入“Hello”。