Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#land中的VARCHAR(1)等价物,SQL插入错误_C#_Sql_Sql Server_Ajax_Asp.net Mvc 4 - Fatal编程技术网

C#land中的VARCHAR(1)等价物,SQL插入错误

C#land中的VARCHAR(1)等价物,SQL插入错误,c#,sql,sql-server,ajax,asp.net-mvc-4,C#,Sql,Sql Server,Ajax,Asp.net Mvc 4,我正在构建一个Web API,它将向Microsoft SQL Server数据库中插入一些值 此API最终将在JavaSpring应用程序中使用 我不想把“马车放在马之前”,所以作为一个POC,我想首先向自己证明,我可以从一个简单的网页调用我的Web API 基本上,我的简单网页有一些文本输入字段,当我点击一个按钮时,我验证文本字段,然后从中创建一个JSON字符串。接下来我有一个Ajax调用,它将这个JSON字符串传递给我的控制器。我在.NETLand中的控制器收到我的请求,但由于以下错误而阻

我正在构建一个Web API,它将向Microsoft SQL Server数据库中插入一些值

此API最终将在JavaSpring应用程序中使用

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

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

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

堆栈跟踪如下

位于System.Data.SqlClient.SqlInternalConnection.OneError。。。废话

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

它们属于
VARCHAR(1)
类型,并且在SQL Server中具有
notnull
属性

在我的简单网页上,我从未为这些值创建文本输入。相反,我认为当我在服务器上执行实际的
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调用,如下所示-

$.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…”错误

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

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


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

此错误意味着您在列中输入了太多数据。您的列需要一个字符串

因此,错误意味着如果您在列中输入
no
。。它将被截断为
n


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

此错误意味着您在列中输入了太多数据。您的列需要一个字符串

因此,错误意味着如果您在列中输入
no
。。它将被截断为
n


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

您可能需要在输入的过程中转换字符串,因为
VARCHAR
是8位的。。而
nvarchar
就足够了。因此,如果可能的话,我建议将该列更改为
nvarchar
。如果不是,则必须在插入之前将字符串转换为字节数组。但它可能是也可能不是单个字节
varchar
期望它采用特定的编码(我想是UCS-2吧?)。通过向SQL提供C#中的UTF-16字符串,您正在给它带来问题。将列更改为
nvarchar
将解决此问题。对,我同意这一点。这一定是因为我拥有的一个字符串大于一个字节。@SimonWhitehead-ADO.Net将负责将.Net类型转换为其等效的SQL类型。如果你发现自己“在插入之前将字符串转换成字节数组”,那你就错了。@Damien_不信者-我不同意。虽然依靠某些东西为你做一些事情是很好的,但这种态度会让你陷入麻烦。最好将您的输出与预期的输入属性尽可能地匹配。您可能需要在输入字符串时转换字符串,因为
varchar
是8位的。。而
nvarchar
就足够了。因此,如果可能的话,我建议将该列更改为
nvarchar
。如果不是,则必须在插入之前将字符串转换为字节数组。但它可能是也可能不是单个字节
varchar
期望它采用特定的编码(我想是UCS-2吧?)。通过向SQL提供C#中的UTF-16字符串,您正在给它带来问题。将列更改为
nvarchar
将解决此问题。对,我同意这一点。这一定是因为我拥有的一个字符串大于一个字节。@SimonWhitehead-ADO.Net将负责将.Net类型转换为其等效的SQL类型。如果你发现自己“在插入之前将字符串转换成字节数组”,那你就错了。@Damien_不信者-我不同意。虽然依靠某些东西为你做一些事情是很好的,但这种态度会让你陷入麻烦。最好尽可能将您的输出与预期的输入属性相匹配。旁注:
varchar(1)
是没有意义的-如果您只有一个字符-只需使用
char(1)
-它将使用1字节的存储-始终<另一方面,code>varchar(1)将使用2到3字节的存储空间,这取决于列中是否有内容。这是由于可变长度字符列的开销造成的。对于小于5-10个字符的字符串-使用
char(n)
-更好!旁注:
varchar(1)
是没有意义的-如果您只有一个字符-只需使用
char(1)
-它将使用1字节的存储-始终<另一方面,code>varchar(1)将使用2到3字节的存储空间,这取决于列中是否有内容。这是由于可变长度字符列的开销造成的。对于小于5-10个字符的字符串-使用
char(n)
-更好!