2017-07-07 6 views
0

サービスにJSONオブジェクトを投稿し、逆シリアル化してデータベースに保存しようとしています。それは働く - 一種。問題は、JSONの一部のフィールドがデータベースに保存され、他のフィールドがnullであることです。サービスはMySQLデータベースにnull値を投稿しています

たとえば、このJSONを投稿するとき:他のすべての値(FirstNameLastNameBirthPlace、一方でのみCurrentPlaceGenderデータベースに...

{ 
"FirstName": "Michael", 
"LastName": "Ledley", 
"BirthPlace": "Austria", 
"Gender": "M", 
"OIB": "12348879991", 
"CurrentPlace": "New Guinea", 
"Department": "D_21570" 
} 

をしてDepartmentは、正しく保存されています... )はNULLです。これらのすべてのタイプはVARCHAR(45)です。正しく格納されているCurrentPlaceと同じです。

保存を実行するコードは次のようになります。

[RoutePrefix("api/employee")] 
public class EmployeeApiController : ApiController 
{ 

    readonly EmployeePersistence persistence; 

    public EmployeeApiController() 
    { 
     persistence = new EmployeePersistence(); 
    } 

    [HttpPost] 
    [Route("")] 
    public void Post([FromBody] Employee employee) 
    { 
     // saving id for the debugging purposes 
     long id = persistence.SaveEmployee(employee); 
    } 


    public long SaveEmployee(Employee employee) 
    { 
     string sqlString = 
      "INSERT INTO Employee (FirstName, LastName, BirthPlace, CurrentPlace, Gender, Department, OIB) " + 
      "VALUES (@FirstName, @LastName, @BirthPlace, @CurrentPlace, @Gender, @Department, @OIB)"; 

     MySqlCommand cmd = new MySqlCommand(sqlString, conn); 

     cmd.Parameters.AddWithValue("@FirstName", employee.FirstName); 
     cmd.Parameters.AddWithValue("@LastName", employee.LastName); 
     cmd.Parameters.AddWithValue("@BirthPlace", employee.BirthPlace); 
     cmd.Parameters.AddWithValue("@CurrentPlace", employee.CurrentPlace); 
     cmd.Parameters.AddWithValue("@Gender", employee.Gender == EmployeeGender.M ? 1 : 0); 
     cmd.Parameters.AddWithValue("@Department", employee.Department.GetStringValue()); 
     cmd.Parameters.AddWithValue("@OIB", employee.OIB); 

     ExecuteSqlCommand(cmd); 
     return cmd.LastInsertedId; 
    } 

    void ExecuteSqlCommand(MySqlCommand cmd) 
    { 
     try 
     { 
      // execute the SQL command 
      cmd.ExecuteNonQuery(); 
     } 
     catch (MySqlException e) 
     { 
      // log the error 
      throw new Exception(
       String.Format("Error executing the command '{0}'. The error is '{1}'.", 
           cmd, e.Message)); 
     } 
    } 

なぜいくつかの値がNULLと、いくつかのデータベースに保存されていないときがありますか?

+1

SaveEmployeeメソッドでemployeeオブジェクトの値をチェックしましたか? –

+0

何らかの理由からデバッガがそのメソッドへの呼び出しをキャッチしないので、実際にはチェックできません。私はビジュアルスタジオに新しいので、多分私はデバッガでsthを間違ってやっている。 – wesleyy

+0

次に、そのクラスに値を設定していないと聞こえるので、従業員クラスに保存されている場所にログを追加します。 – BugFinder

答えて

0

Parameterオブジェクトをより完全に埋め込むことが役立つ場合があります。

の代わりに...

MySqlCommand cmd = new MySqlCommand(sqlString, conn); 
cmd.Parameters.AddWithValue("@FirstName", employee.FirstName); 
    ... 

はこれを試してみてください。

MySqlCommand cmd = new MySqlCommand(sqlString, conn); 
cmd.Parameters.Add("@CategoryName", SqlDbType.VarChar, 45).Value = employee.FirstName; 
    ... 

重要な点は、パラメータのデータ型と長さを明示的に宣言することです。

関連する問題