3

USBからデータベースsqlite3にデータを保存したい。

USBからのデータはこちら

char T0[8], T1[8], T2[8], T3[8], T4[8];

でテーブルを作成します

const char* Temprature_table = "Create table Temprature_1 (ID INTERGER PRIMARY KEY,Thermo_0 decimal(5,1),Thermo_1 decimal(5,1),Thermo_2 decimal(5,1),Thermo_3 decimal(5,1),Thermo_4 decimal(5,1),time DATETIME)";

次に、テーブルにデータを挿入します

result = sqlite3_exec (DB,"Insert  into Temprature VALUES(NULL, T0, T1, T2, T3, T4, time)",0,0,&errmsg);

また

char array[256];
sprintf(array, "Insert into Temprature_1 VALUES(NULL, T0, T1, T2, T3, T4, time)");
result = sqlite3_exec (DB,array,0,0,&errmsg);

しかし、問題があります:「データを挿入できません:そのような列はありません:T0」。何故かはわからない。ありがとう。

4

3 に答える 3

2

C コードと SQL コードは異なるドメインで実行され、変数を共有しません。したがって、SQL コードから C 変数に直接アクセスすることはできません。ドキュメントを見ると、これが正しい解決策のようです。

sqlite3_stmt *ppStmt;
sqlite3_prepare_v2(DB, "Insert into Temprature_1 VALUES(NULL, ?, ?, ?, ?, ?, time)", 58, &ppStmt, NULL);

sqlite3_bind_text(ppStmt, 1, T0, 8, SQLITE_TRANSIENT);
sqlite3_bind_text(ppStmt, 2, T1, 8, SQLITE_TRANSIENT);
sqlite3_bind_text(ppStmt, 3, T2, 8, SQLITE_TRANSIENT);
sqlite3_bind_text(ppStmt, 4, T3, 8, SQLITE_TRANSIENT);
sqlite3_bind_text(ppStmt, 5, T4, 8, SQLITE_TRANSIENT);

sqlite3_step(ppStmt);
sqlite3_finalize(ppStmt);
于 2012-09-14T09:08:46.593 に答える
1

SQL クエリ文字列に C 変数の名前を含めません。

逐語的な値を含めるか (たとえば、 を使用して小さな断片から文字列をプログラムで構成することによりsprintf)、またはパラメーターにプレースホルダーを使用します。後者は、SQL インジェクション攻撃に対してより堅牢であり、一般的に好まれます。ホスト言語が C の場合、貼り付けたクエリに十分なメモリを割り当てる手間も省けます。

準備済みステートメント作成し、それにパラメーターをバインドすることで、プレースホルダーを使用できます。そのステートメントを実行すると、バインドされたパラメーターがプレースホルダーで示された場所で使用されます。

于 2012-09-14T09:08:01.277 に答える
1

クエリに値をバインドするには、準備済みステートメントを使用する必要があります。通常のSQL の形式は次のとおりです。

INSERT INTO Temperature_1 (Thermo_0, Thermo_1) VALUES (23.2, 42.3)

準備されたステートメントは次のようになります

INSERT INTO Temperature_1 (Thermo_0, Thermo_1) VALUES (?, ?)

これにより、セキュリティとパフォーマンスの強化が可能になります。したがって、最終的なコードは次のようになります

sqlite3_stmt *stmt;

sqlite3_prepare_v2(
  db,
  "INSERT INTO Temperature (Thermo_0, Thermo_1) VALUES (?, ?)",
  -1,
  &stmt,
  NULL
);

sqlite3_bind_text(stmt, 1, T0, -1, SQLITE_TRANSIENT);
sqlite3_bind_text(stmt, 2, T1, -1, SQLITE_TRANSIENT);

sqlite3_step(stmt);

このSQLiteの C API の紹介を参照してください。次の文字列をクエリ エンジンに送信するため、コードが機能しません

INSERT INTO table (T0);

INSERT ステートメントの構文は次のようになります。

INSERT INTO <table> VALUES (<expression>[, <expression>[, ...]])

TOデータベース エンジンがクエリを評価するとき、それがたまたまコードのどこかにある変数の名前であることを認識できないため、そのエラーが発生します。SQL は独自の言語であり、C コンテキストとは何も共有しません。

最後の注意として、正しいスペルはTEMPERATUREではなく TEMPERATURE のようです (PR の後に E を忘れました)

于 2012-09-14T09:19:33.873 に答える