C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[10]: C#でSQLiteを接続


(過去ログ 94 を表示中)

[トピック内 15 記事 (1 - 15 表示)]  << 0 >>

■56373 / inTopicNo.1)  C#でSQLiteを接続
  
□投稿者/ える (5回)-(2011/01/12(Wed) 10:56:38)

分類:[C#] 

2011/01/12(Wed) 11:04:07 編集(投稿者)


すみません。ミスしました。

Windows XP
Visual Studio 2008
C#で開発しています。

C#でSQLiteを接続し、
DBから読み出したいと思っています。

以下コーディング
private void DB_Sqlite(string no)
{
/*データベースに接続*/
SQLiteConnection connect = new SQLiteConnection("Data Source=Test.db");
if ((connect == null))
{
MessageBox.Show("データベースの接続に失敗しました。");
return;
}
// データベース接続を開く
connect.Open();
try
{
string mySelectQuery = "SELECT * FROM Testtable where No '" + no + "'";
SQLiteCommand command = new SQLiteCommand(mySelectQuery, connect);

if ((command = connect.CreateCommand()) == null)
{
MessageBox.Show("SQLの実行ができません。");
}
using (SQLiteDataReader sdr = command.ExecuteReader()) ※←ここ
{
List<string[]> tuples = new List<string[]>();
for (int i = 0; sdr.Read(); i++)
{
string[] column = new string[sdr.FieldCount];
for (int j = 0; j < sdr.FieldCount; j++)
{
column[j] = sdr[j].ToString();
}
tuples.Add(column);
}
}

/*データベースの接続を閉じる*/
connect.Close();

/*リリースの開放*/
connect.Dispose();
}
catch (Exception e)
{
MessageBox.Show(e.ToString());
}
/*データベースの接続を閉じる*/
connect.Close();

Console.Read();
}

※の部分で以下のエラーが出てしまいます。
正確にはTry{}catch{}のcatchのMessageBoxで出力されます。
原因はなにかわかりますでしょうか?

以下エラー
System.ArgumentNullException: 値をNullにすることはできません。
パラメータ名:s
場所 System.Text.UTF8Encoding.GetByteCount(String chars)
場所 System.Data.SQLite.SQLiteConvert.ToUTF8(String source Text)
場所 System.Data.SQLite.SQLite3.Prepare(SQLiteConnection cnn,String strSql, SQLiteStatement previous,UInt32 timeoutMS,String& strRemain)
場所 System.Data.SQLite.SQLiteCommand.BuildNextCommand()
場所 System.Data.SQLite.SQLiteCommand.GetStatement(Int32 index)
場所 System.Data.SQLite.SQLiteDataReader.NextResult()
場所 System.Data.SQLite.SQLiteDataReader..ctor(SQLiteCommand cmd,CommandBehavior behave)
場所 System.Data.SQLite.SQLiteCommand.ExcuteReader(CommandBehavior behavior)
場所 System.Data.SQLite.SQLiteCommand.ExcuteReader()
場所 WindowsFormsApplication1.Main.DB_Sqlite(String no)場所 C:Documents and Setting\A\myDocuments\Visual Studio 2008\Projects\WindowsFormsApplication1\Form1.cs:行 140
引用返信 編集キー/
■56379 / inTopicNo.2)  Re[1]: C#でSQLiteを接続
□投稿者/ shu (356回)-(2011/01/12(Wed) 12:35:03)
No56373 (える さん) に返信

SQLiteは使用したことがありませんが

> string mySelectQuery = "SELECT * FROM Testtable where No '" + no + "'";
ここのSQL文『=』とか抜けてませんか?

引用返信 編集キー/
■56380 / inTopicNo.3)  Re[1]: C#でSQLiteを接続
□投稿者/ マサヤ (207回)-(2011/01/12(Wed) 12:41:43)
ブレークポイントでcommandの中身をみてみたらいかがでしょうか?
>string mySelectQuery = "SELECT * FROM Testtable where No '" + no + "'";
これ、SQLインジェクションくらいますよ?
http://idealprogrammer.com/net-languages/code-samples/sql-parameters-insert-statement/

引用返信 編集キー/
■56384 / inTopicNo.4)  Re[2]: C#でSQLiteを接続
□投稿者/ える (6回)-(2011/01/12(Wed) 14:08:07)
No56379 (shu さん) に返信
> ■No56373 (える さん) に返信
>
> SQLiteは使用したことがありませんが
>
>> string mySelectQuery = "SELECT * FROM Testtable where No '" + no + "'";
> ここのSQL文『=』とか抜けてませんか?
>

抜けていないと思います。

一応
string mySelectQuery = "SELECT * FROM Testtable where No = '" + no + "'";
とやってみたのですが
結果は同じでした。
引用返信 編集キー/
■56385 / inTopicNo.5)  Re[2]: C#でSQLiteを接続
□投稿者/ える (7回)-(2011/01/12(Wed) 14:13:56)
No56380 (マサヤ さん) に返信
> ブレークポイントでcommandの中身をみてみたらいかがでしょうか?
commandの中身は{System.Data.SQLite.SQLiteCommand}でした。

> >string mySelectQuery = "SELECT * FROM Testtable where No '" + no + "'";
> これ、SQLインジェクションくらいますよ?
> http://idealprogrammer.com/net-languages/code-samples/sql-parameters-insert-statement/
すみません、上記のページログイン画面になってしまい
見れませんでした。
私なりに解釈して
string mySelectQuery = "SELECT * FROM Shipment where No = ''" + no + "''";
としたのですが
解釈間違っていますでしょうか?
引用返信 編集キー/
■56386 / inTopicNo.6)  Re[3]: C#でSQLiteを接続
□投稿者/ える (8回)-(2011/01/12(Wed) 14:23:17)
2011/01/12(Wed) 14:26:09 編集(投稿者)

上記のように修正すると、下記のエラーになりました。

System.Data.SQLite.SQLiteException:SQLite error near "''":syntax error
場所 System.Data.SQLite.SQLite3.Prepare(SQLiteConnection cnn,String strSql, SQLiteStatement previous,UInt32 timeoutMS,String& strRemain)
場所 System.Data.SQLite.SQLiteCommand.BuildNextCommand()
場所 System.Data.SQLite.SQLiteCommand.GetStatement(Int32 index)
場所 System.Data.SQLite.SQLiteDataReader.NextResult()
場所 System.Data.SQLite.SQLiteDataReader..ctor(SQLiteCommand cmd,CommandBehavior behave)
場所 System.Data.SQLite.SQLiteCommand.ExcuteReader(CommandBehavior behavior)
場所 System.Data.SQLite.SQLiteCommand.ExcuteReader()
場所 WindowsFormsApplication1.Main.DB_Sqlite(String no)場所 C:Documents and Setting\A\myDocuments\Visual Studio 2008\Projects\WindowsFormsApplication1\Form1.cs:行 140

引用返信 編集キー/
■56387 / inTopicNo.7)  Re[3]: C#でSQLiteを接続
□投稿者/ todo (91回)-(2011/01/12(Wed) 14:30:19)
No は予約語かもしれません。

SELECT * FROM Testtable WHERE [No] = '1'
引用返信 編集キー/
■56389 / inTopicNo.8)  Re[4]: C#でSQLiteを接続
□投稿者/ マサヤ (208回)-(2011/01/12(Wed) 14:35:11)
2011/01/12(Wed) 14:36:05 編集(投稿者)

http://itpro.nikkeibp.co.jp/article/MAG/20070608/274192/
こちらでいかがでしょうか?

ちなみにnoの変数の中身に'が入っていた場合、エラーになります。

引用返信 編集キー/
■56391 / inTopicNo.9)  Re[4]: C#でSQLiteを接続
□投稿者/ える (9回)-(2011/01/12(Wed) 15:42:54)
No56387 (todo さん) に返信
> No は予約語かもしれません。
>
> SELECT * FROM Testtable WHERE [No] = '1'
この書き方でもだめでした。
引用返信 編集キー/
■56392 / inTopicNo.10)  Re[5]: C#でSQLiteを接続
□投稿者/ える (10回)-(2011/01/12(Wed) 15:52:04)
2011/01/12(Wed) 15:52:42 編集(投稿者)
No56389 (マサヤ さん) に返信
> 2011/01/12(Wed) 14:36:05 編集(投稿者)
>
> http://itpro.nikkeibp.co.jp/article/MAG/20070608/274192/
> こちらでいかがでしょうか?
>
> ちなみにnoの変数の中身に'が入っていた場合、エラーになります。
>

わざわざありがとうございます。
SQLiteParameterというものを調べてみました。

そこから下記のようにコーディングしてみました。
string mySelectQuery = "SELECT * FROM Testtable ";
mySelectQuery += "WHERE [No] = @No";
SQLiteCommand command = new SQLiteCommand(mySelectQuery, connect);

command.Parameters.Add(new SQLiteParameter("@No", no));

ですが、同じところでエラーが出ます。
以下エラー

System.Data.SQLite.SQLiteException:SQLite error
no such column : No
場所 System.Data.SQLite.SQLite3.Prepare(SQLiteConnection cnn,String strSql, SQLiteStatement previous,UInt32 timeoutMS,String& strRemain)
場所 System.Data.SQLite.SQLiteCommand.BuildNextCommand()
場所 System.Data.SQLite.SQLiteCommand.GetStatement(Int32 index)
場所 System.Data.SQLite.SQLiteDataReader.NextResult()
場所 System.Data.SQLite.SQLiteDataReader..ctor(SQLiteCommand cmd,CommandBehavior behave)
場所 System.Data.SQLite.SQLiteCommand.ExcuteReader(CommandBehavior behavior)
場所 System.Data.SQLite.SQLiteCommand.ExcuteReader()
場所 WindowsFormsApplication1.Main.DB_Sqlite(String no)場所 C:Documents and Setting\A\myDocuments\Visual Studio 2008\Projects\WindowsFormsApplication1\Form1.cs:行 140


引用返信 編集キー/
■56393 / inTopicNo.11)  Re[6]: C#でSQLiteを接続
□投稿者/ shu (357回)-(2011/01/12(Wed) 15:58:16)
No56392 (える さん) に返信

> System.Data.SQLite.SQLiteException:SQLite error
> no such column : No
訳すと、そんな項目はありません:No

項目名がテーブル定義と違っていませんか?
引用返信 編集キー/
■56402 / inTopicNo.12)  Re[7]: C#でSQLiteを接続
□投稿者/ える (11回)-(2011/01/13(Thu) 09:07:29)
No56393 (shu さん) に返信
> ■No56392 (える さん) に返信
>
>>System.Data.SQLite.SQLiteException:SQLite error
>>no such column : No
> 訳すと、そんな項目はありません:No
>
> 項目名がテーブル定義と違っていませんか?

返信が遅くなり申し訳ありません。
テーブル定義を確認しましたが問題ありませんでした。
引用返信 編集キー/
■56403 / inTopicNo.13)  Re[8]: C#でSQLiteを接続
□投稿者/ える (12回)-(2011/01/13(Thu) 09:36:31)
2011/01/13(Thu) 09:36:39 編集(投稿者)

原因がわかりました。

テーブル定義をもう一度見返してみると
Testtableというものがすでにできていたらしく
そのテーブルにNoというものがないといっていたみたいです。
テーブルを一度削除し
新しいテーブルをCreate文すると、エラーも出ず、
うまく実行できました。

ご迷惑おかけしました。
レスくれた方ありがとうございました。
解決済み
引用返信 編集キー/
■56405 / inTopicNo.14)  Re[9]: C#でSQLiteを接続
□投稿者/ shu (358回)-(2011/01/13(Thu) 10:11:27)
No56403 (える さん) に返信

> テーブル定義をもう一度見返してみると
> Testtableというものがすでにできていたらしく
ないと思っていたのですか?そしたら最初に定義はどこで確認されたのでしょう?
テーブルがなければSelect出来ませんが?


解決済み
引用返信 編集キー/
■56410 / inTopicNo.15)  Re[10]: C#でSQLiteを接続
□投稿者/ える (13回)-(2011/01/13(Thu) 13:28:07)
No56405 (shu さん) に返信
> ■No56403 (える さん) に返信
>
>>テーブル定義をもう一度見返してみると
>>Testtableというものがすでにできていたらしく
> ないと思っていたのですか?そしたら最初に定義はどこで確認されたのでしょう?
> テーブルがなければSelect出来ませんが?

あとで気づいたのですが、
Create文でテーブルを作ったつもりでいたのが、
コードが消えてしまっていたみたいでした。
なので、テーブルは作れてないものだと思い、
新しくCreate文でテーブルを作りました。
Create文は別の関数でやっていた為書きませんでした。
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -