2017-01-03 7 views
0

私はVisual Studio 2012を使用してC#を自己学習し、接続の問題を抱えています。基本的には、comboboxを使用して、ユーザーの選択に基づいてデータベースに接続したいと考えています。例えばC#を使用してコンボボックス 'selected'アイテムを使用して接続文字列を設定します

:ユーザがTEST1を選択すると、これはtest1データベースを選択し、TEST2私はつなぎ合わせたtest2

database..etcコードを介してSQLスクリプトからの結果を表示するボタンを使用できるようになります messagebox。現時点では、メッセージボックスには何も表示されないので、これを動作させることはできません。

私はMainConnection()をコメントアウトしました。これは接続が機能しているかどうかを確認するためのテストでした。

誰かが私を正しい方向に向けることができたら大変感謝します。

以下のC#コードを参照してください:それはあなたのSQLでエラーを投げているので

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Drawing; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using System.Windows.Forms; 
using System.Data.SqlClient; 

namespace TestDB 
{ 
public partial class Form1 : Form 
{ 
    class ComboItemExample 
    { 
     public string DisplayString { get; set; } 
     public string ConnectionString { get; set; } 
     public override string ToString() { return DisplayString; } 
    } 
    private string currentConnection = "Data Source= np-2 ;Initial Catalog= TESTDB Integrated Security=true"; 

    public Form1() 
    { 
     InitializeComponent(); 

     var firstConnection = new ComboItemExample { DisplayString = "Data Source= np-2 ;Initial Catalog= TESTDB1 Integrated Security=true" }; 
     comboBox1.Items.Add("TEST1"); 

     var secondConnection = new ComboItemExample { DisplayString = "Data Source= np-2 ;Initial Catalog= TESTDB2 Integrated Security=true" }; 
     comboBox1.Items.Add("TEST2"); 
    } 
    public void MainConnection() 
    { 
     //Make connection to np-2 TESTDB 
     //string str = "Data Source= np-hums12 ;Initial Catalog= TESTDB;" 
     //+ "Integrated Security=true"; 
     // ReadOrderData(str); 
    } 
    public static void ReadOrderData(string currentConnection) 
    { 
     // Run SQL script 

     string queryString = "SELECT *;"; 
     using (SqlConnection connection = new SqlConnection(currentConnection))   
     { 
      SqlCommand command = new SqlCommand(queryString, connection); 
      connection.Open(); 
      SqlDataReader reader = command.ExecuteReader(); 
     } 

     using (SqlConnection connection = new SqlConnection(ConnectionString)) 
     { 
      SqlCommand command = new SqlCommand(queryString, connection); 
      connection.Open(); 
      SqlDataReader reader = command.ExecuteReader(); 

      // call read before accessing data. 
      while (reader.Read()) 
      { 
       //display script in message box 
       MessageBox.Show(reader.GetValue(1).ToString()); 
      } 
     // close when finished reading. 
      reader.Close(); 
     } 
    } 

    private void CloseUI_Click(object sender, EventArgs e) 
    { 
     Application.Exit(); 
    } 

    private void ShowData_Click(object sender, EventArgs e) 
    { 
     MainConnection(); 
    } 

    private void comboBox1_SelectedIndexChanged_1(object sender, EventArgs e) 
    { 
     if (comboBox1.SelectedIndex <= 0) return; 
     var newConnection = ((ComboItemExample)comboBox1.Items[comboBox1.SelectedIndex]).ConnectionString; 

     // use "newConnection" as connection string. 
     currentConnection = newConnection; 
     using (var connection = new SqlConnection(currentConnection)) 
     { 

     } 
    } 
    } 
} 
+1

非常に単純な - 文字列queryString = "SELECT *;"; "はテーブルが指定されていないのでエラーをスローします。 – Takarii

+0

AFAIK Select *は有効なSQLコマンドではありません。 "Select * FROM [あなたのテーブル名]"を試してください – Jaxi

答えて

0

は、あなたの接続文字列が正しく、機能していると仮定すると、それは何も表示されない理由があります。

このラインはあなたのミスが

string queryString = "SELECT *;"; 

をどこにあるか、それが有効なSQLクエリではないです、あなたもテーブルを指定する必要があります。将来的には、潜在的なエラーを特定するのに役立つtry-catchステートメントを使用することが賢明です。

あなたのコードの例では、あなたは

using (SqlConnection connection = new SqlConnection(ConnectionString)) 
{ 
    SqlCommand command = new SqlCommand(queryString, connection); 

    try 
    { 
     connection.Open(); 
     using (var reader = command.ExecuteReader()) 
     { 
      while (reader.Read()) 
      { 
       MessageBox.Show(reader.GetValue(1).ToString()); 
      } 

      //dont need to close the reader as the using statement will dispose of it once finished anyway 
     } 

    connection.Close(); 
    } 
    catch (Exception ex) 
    { 
     connection.Close(); 
     Console.WriteLine(ex.Message); 
     //or, depending on the package Debug.WriteLine(ex.Message); 
    } 
} 

は、この例外をプリントアウトし、あまりにもロックアップあなたのプログラムを停止します使用することができます。現状のまま、あなたの現在のものは何も発見されなかったというエラーを投げませんが、出力ログにSQL例外がスローされますが、詳細は示されません。 Exeception.Messageが詳細を提供します。SqlException.MessageはSQL関連のメッセージを提供します。

編集:あなたが投稿のコメント(と私が以前逃した何か)に対応して

あなたComboBoxのアイテムが追加されている方法を見て、あなたも、あなたが持っていると思うのオブジェクトを追加していません。あなたのコードから、あなたのコンボボックス項目は "TEST1"と "TEST2" - 接続文字列ではありません。

代わりに、あなたは

string myConnectionVal = comboBox1.SelectedValue.ToString(); 

クエリのコンボボックスから値を取得するために、そして、そう

comboBox1.Items.Add(new ComboItemExample() {DisplayString ="TEST1",ConnectionString = "Data Source= np-2 ;Initial Catalog= TESTDB1 Integrated Security=true"}); 
comboBox1.Items.Add(new ComboItemExample() {DisplayString ="TEST2",ConnectionString = "Data Source= np-2 ;Initial Catalog= TESTDB2 Integrated Security=true"}); 
comboBox1.DisplayMember = "DisplayString"; 
comboBox1.ValueMember = "ConnectionString"; 

のようなボックスに、あなたのオブジェクトを追加することができますが、キャストエラーを取得している理由は、最初にコンボボックスにComboItemExampleを割り当てたことがないためです。上記の項目を追加することで、将来これを行うことができますが、必要なのはオブジェクトからの単一の値であれば、ValueMemberの方が使いやすくなります。

+0

これに私に戻ってくれてありがとうございました。私はSQL 'queryString'を編集して、指定された列のデータを読み込んで、これが動作するかどうかを調べます。コンボボックスからTEST1を選択するとメッセージボックスには何も出力されませんが、TEST2を選択すると 'InvalidCastExceptionが処理されませんでした'という例外エラーが表示されます - 'System.String'タイプのオブジェクトを 'ComboItemExample'これで失われた – DanH

+0

@DanH更新を参照してください – Takarii

0

あなたはコンボボックスにテキスト値を追加するだけですが、実際に接続文字列をバインドしていないようです。誤って値 "TEST1"と "TEST2"を接続文字列として渡すことがあります。コンストラクタで作成している新しい変数を、それらの文字列ではなく新しい項目として追加する必要があります。項目をパラメータとするAdd()を使用します。

mycombobox.Add(new Item("Test1", firstConnection)); 
+0

ちょっと愚かですが、コンストラクタがそうであると言うとき.. private void comboBox1_selectedIndexChanged_1(オブジェクト送信者、EventArgs e) – DanH

関連する問題