Angular 11 HTTP POST 到 SQL 服务器数据库
Angular 11 HTTP POST to SQL Server Database
我正在尝试 post 我的输入到我的 SQL 服务器数据库。我实际上可以 POST
到数据库,但我得到一个空白响应。我知道这是因为我正在 returning “成功”而不是我的变量,但是如何为 return 语句正确设置格式?
POST方法:
[HttpPost]
public JsonResult Post(Weather Wea)
{
string query = @"INSERT INTO dbo.Information (Date, TemperatureC, TemperatureF, Summary) VALUES ('" + Wea.Date + @"'
,'" + Wea.TemperatureC + @"'
,'" + Wea.TemperatureF + @"'
,'" + Wea.Summary + @"'
)";
DataTable table = new DataTable();
string sqlDataSource = _configuration.GetConnectionString("WeatherAppCon");
SqlDataReader myReader;
using (SqlConnection myCon = new SqlConnection(sqlDataSource))
{
myCon.Open();
using (SqlCommand myCommand = new SqlCommand(query, myCon))
{
myReader = myCommand.ExecuteReader();
table.Load(myReader);
myReader.Close();
myCon.Close();
}
}
return new JsonResult("Success");
}
前端POST
export class PostDataComponent {
baseUrl: string;
date: number;
temperatureC: number;
summary: string;
weatherForm: FormGroup;
constructor(public http: HttpClient, @Inject('BASE_URL') baseUrl: string, private formBuilder: FormBuilder) {
this.baseUrl = "https://localhost:44347/WeatherForecast";
this.weatherForm = formBuilder.group({
Date: new FormControl(),
TemperatureC: new FormControl(),
Summary: new FormControl()
});
}
CreateData() {
const params = new HttpParams({
fromObject: {
'date': this.weatherForm.value.Date.toString(),
'temperatureC': this.weatherForm.value.TemperatureC.toString(),
'summary': this.weatherForm.value.Summary.toString()
}
});
console.log(params);
this.http.post(this.baseUrl, {},{ params: params }).subscribe(data => {
console.log(data);
});
}
}
这里有一些东西。
- 正如 marc_s 评论的那样,您应该使用参数化而不是连接以避免任何潜在的 SQL 注入:
string query = @"INSERT INTO dbo.Information (Date, TemperatureC, TemperatureF, Summary) VALUES (@Date, @TemperatureC, @TemperatureF, @Summary)";
...
using (System.Data.SqlClient.SqlCommand myCommand = new SqlCommand(query, myCon))
{
myCommand.Parameters.AddWithValue("@Date", Wea.Date);
myCommand.Parameters.AddWithValue("@TemperatureC", Wea.TemperatureC);
myCommand.Parameters.AddWithValue("@TemperatureF", Wea.TemperatureF);
myCommand.Parameters.AddWithValue("@Summary", Wea.Summary);
...
- 除非您的目标 table 上有一个带有输出的触发器,否则您的查询不会 returning 任何数据(只是插入的行数)和您的
SqlDataReader
是空的。在这种情况下,您可以去掉 reader/DataTable
并改用 myCommand.ExecuteScalar()
。如果你有一个触发器输出插入的数据,忽略这个。
- 如果您没有输出触发器但出于任何原因仍然需要 return 插入的值,您可以保留
SqlDataReader
并将查询更新为以下内容
string query = @"INSERT INTO dbo.Information (Date, TemperatureC, TemperatureF, Summary)
OUTPUT inserted.Date,inserted.TemperatureC,inserted.TemperatureF,inserted.Summary
VALUES (@Date, @TemperatureC, @TempreatureF, @Summary)";
- 在不知道您正在寻找的响应格式的情况下,很难给出如何生成它的答案。如果您需要 return 插入的值,您可以像上一条那样使用 OUTPUT 关键字并序列化您的
DataTable
.
我正在尝试 post 我的输入到我的 SQL 服务器数据库。我实际上可以 POST
到数据库,但我得到一个空白响应。我知道这是因为我正在 returning “成功”而不是我的变量,但是如何为 return 语句正确设置格式?
POST方法:
[HttpPost]
public JsonResult Post(Weather Wea)
{
string query = @"INSERT INTO dbo.Information (Date, TemperatureC, TemperatureF, Summary) VALUES ('" + Wea.Date + @"'
,'" + Wea.TemperatureC + @"'
,'" + Wea.TemperatureF + @"'
,'" + Wea.Summary + @"'
)";
DataTable table = new DataTable();
string sqlDataSource = _configuration.GetConnectionString("WeatherAppCon");
SqlDataReader myReader;
using (SqlConnection myCon = new SqlConnection(sqlDataSource))
{
myCon.Open();
using (SqlCommand myCommand = new SqlCommand(query, myCon))
{
myReader = myCommand.ExecuteReader();
table.Load(myReader);
myReader.Close();
myCon.Close();
}
}
return new JsonResult("Success");
}
前端POST
export class PostDataComponent {
baseUrl: string;
date: number;
temperatureC: number;
summary: string;
weatherForm: FormGroup;
constructor(public http: HttpClient, @Inject('BASE_URL') baseUrl: string, private formBuilder: FormBuilder) {
this.baseUrl = "https://localhost:44347/WeatherForecast";
this.weatherForm = formBuilder.group({
Date: new FormControl(),
TemperatureC: new FormControl(),
Summary: new FormControl()
});
}
CreateData() {
const params = new HttpParams({
fromObject: {
'date': this.weatherForm.value.Date.toString(),
'temperatureC': this.weatherForm.value.TemperatureC.toString(),
'summary': this.weatherForm.value.Summary.toString()
}
});
console.log(params);
this.http.post(this.baseUrl, {},{ params: params }).subscribe(data => {
console.log(data);
});
}
}
这里有一些东西。
- 正如 marc_s 评论的那样,您应该使用参数化而不是连接以避免任何潜在的 SQL 注入:
string query = @"INSERT INTO dbo.Information (Date, TemperatureC, TemperatureF, Summary) VALUES (@Date, @TemperatureC, @TemperatureF, @Summary)";
...
using (System.Data.SqlClient.SqlCommand myCommand = new SqlCommand(query, myCon))
{
myCommand.Parameters.AddWithValue("@Date", Wea.Date);
myCommand.Parameters.AddWithValue("@TemperatureC", Wea.TemperatureC);
myCommand.Parameters.AddWithValue("@TemperatureF", Wea.TemperatureF);
myCommand.Parameters.AddWithValue("@Summary", Wea.Summary);
...
- 除非您的目标 table 上有一个带有输出的触发器,否则您的查询不会 returning 任何数据(只是插入的行数)和您的
SqlDataReader
是空的。在这种情况下,您可以去掉 reader/DataTable
并改用myCommand.ExecuteScalar()
。如果你有一个触发器输出插入的数据,忽略这个。 - 如果您没有输出触发器但出于任何原因仍然需要 return 插入的值,您可以保留
SqlDataReader
并将查询更新为以下内容
string query = @"INSERT INTO dbo.Information (Date, TemperatureC, TemperatureF, Summary)
OUTPUT inserted.Date,inserted.TemperatureC,inserted.TemperatureF,inserted.Summary
VALUES (@Date, @TemperatureC, @TempreatureF, @Summary)";
- 在不知道您正在寻找的响应格式的情况下,很难给出如何生成它的答案。如果您需要 return 插入的值,您可以像上一条那样使用 OUTPUT 关键字并序列化您的
DataTable
.