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)
ます。
これが私の悲しみの原因ですか、それとも何か他のことが起こっていますか?