我正在构建一个 Web API,它将一些值插入 Microsoft SQL Server 数据库。
此 API 的最终使用将在 JAVA Spring 应用程序中。
我不想“本末倒置”,所以作为 POC,我想先向自己证明,我可以从一个简单的网页调用我的 Web API。
本质上,我的简单网页有一些文本输入字段,当我单击按钮时,我会验证文本字段,然后从中创建一个 JSON 字符串。接下来我有一个 Ajax 调用,将这个 JSON 字符串传递给我的控制器。我在 .NET 土地上的控制器收到了我的请求,但因以下错误而窒息 -
发生错误。","ExceptionMessage":"字符串或二进制数据将被截断。
堆栈跟踪如下。
在 System.Data.SqlClient.SqlInternalConnection.OnError ... 等等等等
我认为问题出在我试图插入的几个列中。
它们属于类型VARCHAR(1)
并具有NOT NULL
SQL Server 中的属性。
在我的简单网页上,我从未为这些值创建文本输入。相反,我认为当我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 的 3 个实例no
。
这些参数是字符串,但 SQL Server 需要VARCHAR(1)
.
这是造成我悲伤的原因,还是有其他事情发生?