【发布时间】:2016-11-26 14:18:42
【问题描述】:
应该如何使用 C# 对 SQL Server 数据库执行 CRUD 操作?
例如,假设有一个 DB 表 Employees 包含这些列:
EmployeeID, FirstName, PostalCode
我希望向该数据库发布一个新员工的信息。什么是实现这一目标的有效方法?
我现在的HttpPost:
namespace API.Controllers
{
public class EmployeesController : ApiController
{
[HttpPost]
public void AddEmployee (Employee employee)
{
SqlConnection myConnection = new SqlConnection();
myConnection.ConnectionString = @"Server=.\servername;Database=Northwind;User ID=Username;Password=password;";
SqlCommand sqlCmd = new SqlCommand();
sqlCmd.CommandType = CommandType.Text;
sqlCmd.CommandText = "INSERT INTO Employee (EmployeeID,FirstName,PostalCode) Values (@EmployeeID, @FirstName, @Zip)";
sqlCmd.Parameters.AddWithValue("@EmployeeID", employee.EmployeeID);
sqlCmd.Parameters.AddWithValue("@FirstName", employee.FirstName);
sqlCmd.Parameters.AddWithValue("@Zip", employee.Zip);
myConnection.Open();
int rowInserted = sqlCmd.ExecuteNonQuery();
myConnection.Close();
}
}
}
这是Employee 模型:
namespace API.Models
{
public class Employee
{
public int EmployeeID { get; set; }
public string FirstName { get; set; }
public int Zip { get; set; }
}
}
当我使用 Fiddler 使用以下输入测试我的 API 时:
{ "EmployeeID":91, "FirstName":"Vader", "Zip":94221}
我收到此错误:
HTTP/1.1 415 不支持的媒体类型
没有任何东西被插入到数据库中。
任何指导将不胜感激。
WebApiConfig.cs:
namespace API
{
public static class WebApiConfig
{
public static void Register(HttpConfiguration config)
{
// Web API configuration and services
// Web API routes
config.MapHttpAttributeRoutes();
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
}
}
}
根据请求生成的原始错误消息:
HTTP/1.1 415 不支持的媒体类型
缓存控制:无缓存
编译指示:无缓存
内容类型:应用程序/json;字符集=utf-8
过期:-1
服务器:Microsoft-IIS/10.0
X-AspNet-版本:4.0.30319
X-SourceFiles: =?UTF-8?B?YzpcdXNlcnNcYW1lc2tvXGRvY3VtZW50c1x2aXN1YWwgc3R1ZGlvIDIwMTVcUHJvamVjdHNcQVBJXEFQSVxhcGlcRW1wbG95ZWVzXEFkZEVtcGxveWVl?=
X-Powered-By:ASP.NET
日期:格林威治标准时间 2016 年 7 月 22 日星期五 15:33:06
内容长度:986
{"Message":"请求包含实体主体,但没有 Content-Type 标头。此资源不支持推断的媒体类型 'application/octet-stream'。",
"ExceptionMessage":"没有 MediaTypeFormatter 可用于从媒体类型为 'application/octet-stream' 的内容中读取类型为 'Employee' 的对象。",
"ExceptionType":"System.Net.Http.UnsupportedMediaTypeException",
"StackTrace":" 在 System.Net.Http.HttpContentExtensions.ReadAsAsync[T](HttpContent 内容,类型类型,IEnumerable1 格式化程序,IFormatterLogger formatterLogger,CancellationToken cancelToken)\r\n 在 System.Net.Http.HttpContentExtensions。 ReadAsAsync(HttpContent content, Type type, IEnumerable1 formatters, IFormatterLogger formatterLogger, CancellationToken cancelToken)\r\n at System.Web.Http.ModelBinding.FormatterParameterBinding.ReadContentAsync(HttpRequestMessage request, Type type, IEnumerable`1 formatters, IFormatterLogger formatterLogger, CancellationToken cancelToken )"}
【问题讨论】:
-
你的
Content-Type标头是什么?application/json? -
是的。然后我的程序在
localhost:55239上运行,我使用localhost:55239/api/Employees/AddEmployee访问我的POST。 -
你能发布你的RouteConfig吗?
-
发布了我在 VisualStudio 中生成的
WebApiConfig。我刚刚意识到我一定已经删除了 VS 创建的RouteConfig.cs。我会尝试将其添加回来,看看会发生什么。 -
请添加通过 Fiddler 发布的原始请求。
标签: c# asp.net-web-api