0

MicrosoftSQLServerデータベースにいくつかの値を挿入するWebAPIを構築しています。

このAPIの最終的な使用法は、JAVASpringアプリケーションで行われます。

「馬の前に馬車」を置きたくないので、POCとして、最初に、単純なWebページからWebAPIを呼び出すことができることを証明したいと思いました。

基本的に、私の単純なWebページにはいくつかのテキスト入力フィールドがあり、ボタンをクリックすると、テキストフィールドを検証し、それらからJSON文字列を作成します。次に、このJSON文字列をコントローラーに渡すAjax呼び出しがあります。.NETランドのコントローラーがリクエストを受信しましたが、次のエラーでチョークします-

エラーが発生しました。"、" ExceptionMessage ":"文字列またはバイナリデータが切り捨てられます。

そして、スタックトレースが続きます。

System.Data.SqlClient.SqlInternalConnection.OnErrorで...何とか何とか

問題は、挿入しようとしているいくつかの列にあると思います。

それらはタイプVARCHAR(1)であり、SQLServerのプロパティを持っていNOT NULLます。

私の単純なWebページでは、これらの値のテキスト入力を作成したことはありません。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文字列を次のようにAJAXCALLに渡します-

$.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ブロックで停止し、「文字列またはバイナリデータ...」エラーを出します。

引数のリストで、文字列の3つのインスタンスを渡すことに注意してくださいno

これらの引数は文字列ですが、SQLServerはを期待していVARCHAR(1)ます。

これが私の悲しみの原因ですか、それとも何か他のことが起こっていますか?

4

1 に答える 1

3

このエラーは、列にデータを入れすぎていることを意味します。列には1文字の文字列が必要です。

したがって、エラーはno、列に入れると..に切り捨てられることを意味しnます。

別の例:列がVARCHAR(5)「HelloWorld!」を挿入した場合、「Hello」しか挿入できないという警告が表示されます。

于 2013-01-31T22:09:37.743 に答える