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.