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

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

ログ内検索
  • キーワードを複数指定する場合は 半角スペース で区切ってください。
  • 検索条件は、(AND)=[A かつ B] (OR)=[A または B] となっています。
  • [返信]をクリックすると返信ページへ移動します。
キーワード/ 検索条件 /
検索範囲/ 強調表示/ ON (自動リンクOFF)
結果表示件数/ 記事No検索/ ON
大文字と小文字を区別する

No.56373 の関連記事表示

<< 0 >>
■56373  C#でSQLiteを接続
□投稿者/ える -(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
親記事 /過去ログ94より / 関連記事表示
削除チェック/

■56380  Re[1]: C#でSQLiteを接続
□投稿者/ マサヤ -(2011/01/12(Wed) 12:41:43)
記事No.56373 のレス /過去ログ94より / 関連記事表示
削除チェック/

■56385  Re[2]: C#でSQLiteを接続
□投稿者/ える -(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 + "''";
    としたのですが
    解釈間違っていますでしょうか?
記事No.56373 のレス /過去ログ94より / 関連記事表示
削除チェック/

■56379  Re[1]: C#でSQLiteを接続
□投稿者/ shu -(2011/01/12(Wed) 12:35:03)
    No56373 (える さん) に返信

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

    > string mySelectQuery = "SELECT * FROM Testtable where No '" + no + "'";
    ここのSQL文『=』とか抜けてませんか?
記事No.56373 のレス /過去ログ94より / 関連記事表示
削除チェック/

■56384  Re[2]: C#でSQLiteを接続
□投稿者/ える -(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 + "'";
    とやってみたのですが
    結果は同じでした。
記事No.56373 のレス /過去ログ94より / 関連記事表示
削除チェック/

■56387  Re[3]: C#でSQLiteを接続
□投稿者/ todo -(2011/01/12(Wed) 14:30:19)
    No は予約語かもしれません。

    SELECT * FROM Testtable WHERE [No] = '1'
記事No.56373 のレス /過去ログ94より / 関連記事表示
削除チェック/

■56391  Re[4]: C#でSQLiteを接続
□投稿者/ える -(2011/01/12(Wed) 15:42:54)
    No56387 (todo さん) に返信
    > No は予約語かもしれません。
    >
    > SELECT * FROM Testtable WHERE [No] = '1'
    この書き方でもだめでした。
記事No.56373 のレス /過去ログ94より / 関連記事表示
削除チェック/

■56386  Re[3]: C#でSQLiteを接続
□投稿者/ える -(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
記事No.56373 のレス /過去ログ94より / 関連記事表示
削除チェック/

■56389  Re[4]: C#でSQLiteを接続
□投稿者/ マサヤ -(2011/01/12(Wed) 14:35:11)
記事No.56373 のレス /過去ログ94より / 関連記事表示
削除チェック/

■56392  Re[5]: C#でSQLiteを接続
□投稿者/ える -(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

記事No.56373 のレス /過去ログ94より / 関連記事表示
削除チェック/

■56393  Re[6]: C#でSQLiteを接続
□投稿者/ shu -(2011/01/12(Wed) 15:58:16)
    No56392 (える さん) に返信

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

    項目名がテーブル定義と違っていませんか?
記事No.56373 のレス /過去ログ94より / 関連記事表示
削除チェック/

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

    返信が遅くなり申し訳ありません。
    テーブル定義を確認しましたが問題ありませんでした。
記事No.56373 のレス /過去ログ94より / 関連記事表示
削除チェック/

■56403  Re[8]: C#でSQLiteを接続
□投稿者/ える -(2011/01/13(Thu) 09:36:31)
    2011/01/13(Thu) 09:36:39 編集(投稿者)

    原因がわかりました。

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

    ご迷惑おかけしました。
    レスくれた方ありがとうございました。
記事No.56373 のレス / END /過去ログ94より / 関連記事表示
削除チェック/

■56405  Re[9]: C#でSQLiteを接続
□投稿者/ shu -(2011/01/13(Thu) 10:11:27)
    No56403 (える さん) に返信

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

記事No.56373 のレス / END /過去ログ94より / 関連記事表示
削除チェック/

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

    あとで気づいたのですが、
    Create文でテーブルを作ったつもりでいたのが、
    コードが消えてしまっていたみたいでした。
    なので、テーブルは作れてないものだと思い、
    新しくCreate文でテーブルを作りました。
    Create文は別の関数でやっていた為書きませんでした。
記事No.56373 のレス / END /過去ログ94より / 関連記事表示
削除チェック/



<< 0 >>

パスワード/

- Child Tree -