2016-04-14 5 views
0

自分のデータを自分のデータベースに挿入しようとしていますが、手動で値を入力しようとしましたが、エラーが発生し続けます。私はデバッグし、私の価値を発見することはnullではありませんが、エラーSQL PreparedStatement Android

Cannot insert the value NULL into column 'AssignedGameID', table 'dementiafypdb.dbo.gameRecord'; column does not allow nulls. INSERT fails. 

は、これは私のデータベース接続です:

public GameManager(String pID, String gID, int sNo){ 
     patientID=pID; 
     gameID = gID; 
     sqlNo = sNo; 
    } 
    public GameManager(String pID, String gID, int sNo, int s, int t){ 
     patientID=pID; 
     gameID = gID; 
     sqlNo = sNo; 
     score = s; 
     time = t; 
    } 


    //This method is called to run Game Manager 
    public void GameMgrStart(){ 
     Connection conn=null; 
     String sqlStatement; 
     try { 
      conn = dbConnect(); 

      sqlStatement = sqlStats(); 

      //Run statement 
      PreparedStatement cmdSql = conn.prepareStatement(sqlStatement); 
      cmdSql.execute(); 

      System.out.println("" + sqlStatement); 
     } 
     catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 

    //List of SQL Statements 
    public String sqlStats(){ 
     String sqlStatement= ""; 

     if(sqlNo == 1){ 
      sqlStatement = "INSERT INTO GameRecord(Score, timeTaken, AssignedGameID) Values('" + score + "', '" + time + "', (SELECT top 1 assignedGameID FROM assignedGame WHERE gameID='" + gameID + "' and patientAllocationID=(SELECT patientAllocationID FROM patientAllocation WHERE patientID='" + patientID + "')))"; 
     } 

     return sqlStatement; 
    } 

    //Method to connect to database 
    public Connection dbConnect(){ 
     Connection conn = null; 
     try { 
      Class.forName("net.sourceforge.jtds.jdbc.Driver"); 

      //conn = DriverManager.getConnection(dbURL+dbName+dbSecurity); 
      conn = DriverManager.getConnection(dbURL+dbName+dbUsername+dbPassword); 
      if (conn != null) { 
       System.out.println("Connected"); 
       return conn; 

      } 
      else 
       System.out.println("Failed"); 

     } 
     catch (Exception e) { 
      e.printStackTrace(); 
     } 

     return conn; 
    } 

これは

プライベートクラスAsyncCallerが延びてデータベースにアクセスするための私のコードですAsyncTask {

@Override 
protected Void doInBackground(Void... params) { 
    String patientID ="1", gameID ="1"; 
    int sID = 1, score = 10, time = 30; 

    GameManager gameManager = new GameManager(patientID,gameID,sID,score,time); 
    gameManager.GameMgrStart(); 
    return null; 
} 

}

どこが間違っているのか分かりますか?

答えて

0

これはあなたのINSERT文です:

INSERT INTO GameRecord(Score, timeTaken, AssignedGameID) 
    Values('" + score + "', '" + time + "', (SELECT top 1 assignedGameID FROM assignedGame WHERE gameID='" + gameID + "' and patientAllocationID=(SELECT patientAllocationID FROM patientAllocation WHERE patientID='" + patientID + "')))"; 

これは、より簡単にVALUESせずに書かれている:

INSERT INTO GameRecord(Score, timeTaken, AssignedGameID) 
    SELECT top 1 '" + score + "', '" + time + "', assignedGameID 
    FROM assignedGame 
    WHERE gameID='" + gameID + "' and 
     patientAllocationID = (SELECT patientAllocationID FROM patientAllocation WHERE patientID='" + patientID + "')"; 

あなたのエラーは、クエリがすべての行を返すされていないことを示唆しています。 VALUESを使用すると、行がないとNULLが生成されます。 INSERT . . . SELECTを使用すると、挿入は試行されません。

+0

うん、それは動作します!しかし、最後には小さな構文エラーがありますが、1つの括弧しかありません:) –

関連する問題