2016-04-08 7 views
0

VarChar列の文字列変数を使用してテーブルにレコードを追加しようとしています。私は次のインクリメントされたIDの下にそれを与える値を挿入したいと思います。しかし、私はコードを実行しようとすると、 "そのような列は存在しない"というSQLエラーが発生し続ける。エラーがどこに発生するのかについての詳細はないので、私はまったく詰まっています。レコードをテーブルに挿入するにはどうしたらいいですか?SQLiteを使ってUnityのテーブルにレコードを挿入するには?

ここに私のコードは、OOPに従っている場合、あなたが人生をシンプルになりますね

using UnityEngine; 
using Mono.Data.Sqlite; 
using System.Data; 
using UnityEngine.UI; 
using System.Collections; 

public class AddQuery : MonoBehaviour { 

    public Text cipher; 
    public Text initialMessage; 
    public Text encryptedMessage; 

    private string _constr = "URI=file:previousMessages.db"; 
    private IDbConnection _dbc; 
    private IDbCommand _dbcm; 
    private IDataReader _dbr; 


public void AddSQL() { 
    string _cipher = cipher.text; 
    string _initialMessage = initialMessage.text; 
    string _encryptedMessage = encryptedMessage.text; 

    _dbc = new SqliteConnection(_constr); 
    _dbc.Open(); 

    _dbcm = _dbc.CreateCommand(); 
    _dbcm.CommandText = "CREATE TABLE IF NOT EXISTS previousMessages (ID INTEGER NOT NULL PRIMARY KEY , Cipher VARCHAR(5000) NOT NULL, InitialMessage VARCHAR(5000) NOT NULL,EncryptedMessage TEXT NOT NULL)"; 
    _dbr = _dbcm.ExecuteReader(); 
    _dbr.Close(); 

    _dbcm.CommandText = "INSERT INTO previousMessages (Cipher, InitialMessage, EncryptedMessage) VALUES ("+_cipher+", "+_initialMessage+", "+_encryptedMessage+")"; 
    _dbr = _dbcm.ExecuteReader(); 
    _dbr.Close(); 

    _dbcm.CommandText = "SELECT FROM previousMessages (Cipher, InitialMessage, EncryptedMessage) VALUES (" + _cipher + ", " + _initialMessage + ", " + _encryptedMessage + ")"; 
    _dbr = _dbcm.ExecuteReader(); 

    while (_dbr.Read()) 
    { 
     Debug.Log("Cipher: " + _dbr["Cipher"] + "\t Initial: " + _dbr["InitialMessage"]); 
    } 

} 

}

答えて

2

です。私はあなたがむしろメソッドに1つだけをさせることを意味します。それが1つだけのことをする他のメソッドへの呼び出しのリストにするよりも、多くのことをする必要がある場合。ことでは言った、あなたのAddSQL()休憩まで:

public void AddSQL() { 
    string _cipher = cipher.text; 
    string _initialMessage = initialMessage.text; 
    string _encryptedMessage = encryptedMessage.text; 

    OpenConnection(); 
    ExecuteCreateCommand(); 
    InsertCommand(_cipher, _initialMessage, _encryptedMessage); 
    ReadStuff(_cipher, _initialMessage, _encryptedMessage); 
    DebugRead(); 

} 

void OpenConnection(){ 
    _dbc = new SqliteConnection(_constr); 
    _dbc.Open(); 
} 

void ExecuteCreateCommand(){ 
    _dbcm = _dbc.CreateCommand(); 
    _dbcm.CommandText = "CREATE TABLE IF NOT EXISTS previousMessages (ID INTEGER NOT NULL PRIMARY KEY , Cipher VARCHAR(5000) NOT NULL, InitialMessage VARCHAR(5000) NOT NULL,EncryptedMessage TEXT NOT NULL)"; 
    _dbr = _dbcm.ExecuteReader(); 
    _dbr.Close(); 
} 

void InsertCommand(string _cipher, string _initialMessage, string _encryptedMessage){ 
    _dbcm.CommandText = "INSERT INTO previousMessages (Cipher, InitialMessage, EncryptedMessage) VALUES ("+_cipher+", "+_initialMessage+", "+_encryptedMessage+")"; 
    _dbr = _dbcm.ExecuteReader(); 
    _dbr.Close(); 
} 

void ReadStuff(string _cipher, string _initialMessage, string _encryptedMessage){ 
    _dbcm.CommandText = "SELECT FROM previousMessages (Cipher, InitialMessage, EncryptedMessage) VALUES (" + _cipher + ", " + _initialMessage + ", " + _encryptedMessage + ")"; 
    _dbr = _dbcm.ExecuteReader(); 
} 

void DebugRead(){ 
    while (_dbr.Read()) 
    { 
     Debug.Log("Cipher: " + _dbr["Cipher"] + "\t Initial: " + _dbr["InitialMessage"]); 
    } 
} 

AddSQL()コメントすべてのメソッド呼び出しと例外がスローされたクエリを確認する一つのコメントを解除1インチ

+0

ありがとうございました。私は時には私のコーディングでちょっと混乱することがあります。私はまだ文字列 "Ceaser"がテーブルに "このような列は存在しません"と表示されないことを明らかにしています。なぜこれが起こっているのか知っていますか? –

+0

ポイントは、どの行でエラーが発生したかを伝えることでした。しかし、 'ExecuteCreateCommand()'と 'InsertCommand()'では '_dbcm.ExecuteReader()'の代わりに '_dbcm.ExecuteNonQuery()'を使う必要があります。確かに。 [ExecuteNonQuery docs](https://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlcommand.executenonquery(v = vs.110).aspx)では、これを使用してデータベースオブジェクトを作成することができますテーブル* –

関連する問題