2016-04-10 13 views
-1

現在、SQL Serverデータベースからデータを読み取ることができない大学の割り当てに取り組んでいます。私はDentist Name列を読んで、これらの名前をコンボボックスに追加しようとしています。C#でSQL Serverデータベースから読み込むことがありません

ただし、列名を入力するとエラーが表示されます。

私のテーブルは列Dentist IDDentist NameDentist SurnameDOBGenderdentistInfoと呼ばれています。

最終的に私が正しく読み上げられるようになると、名前がコンボボックスから選択されたときにその情報を入力できるようになります。

public partial class Dentist_Info : Form 
{ 
    Surgery mySurgery = new Surgery(); 
    private SqlConnection conn; 
    private SqlCommand cmd; 
    private SqlDataAdapter da; 
    Surgery _formsSurgery; 

    public Dentist_Info(Surgery SurgeryToDisplay) 
    { 
     _formsSurgery = SurgeryToDisplay; 
    } 

    public void FillCombo() 
    { 
     SqlConnection conn = new SqlConnection(@"Data Source = GGJG; Initial Catalog = DentistDB; Integrated Security = True"); 
     SqlCommand SelectCommand = new SqlCommand("SELECT * FROM DentistInfo", conn); 

     SqlDataReader myreader; 
     conn.Open(); 

     try 
     { 
      myreader = SelectCommand.ExecuteReader(); 

      while (myreader.Read()) 
      { 
       string dname = myreader.GetString("Dentist Name"); 
       comboBox1.Items.Add(dname); 
      } 

      conn.Close(); 
     } 
     catch (Exception ex) 
     { 
      throw new Exception(ex.Message, ex); 
     } 
     finally 
     { 
      if (conn != null) 
      { 
       conn.Close(); 
      } 
     } 
    } 
+0

変更この行を '文字列DNAME = myreader.GetString( "Dentist Name"); 'からへ'string dname =(string)myreader [" Dentist Name "];私たちがエラーの内容を知っていれば助けになるでしょう。 – MethodMan

+2

カラム名にスペースが含まれていると、SQLクエリーの評価時にエラーが発生します。データベースがSQL Serverの場合は、この「SELECT [Dentist ID]、[Dentist Name]、Dentist Surname、DOB、Gender FROM DentistInfo」を試してください。 MySQLの場合は、sqare bracketの代わりにgrave accentを使用します。 – derloopkat

+0

実際のエラーメッセージを投稿する必要があります。それはガレージに行き、私の '車が壊れている、それを修正する'と言っている。 –

答えて

0

これを試してみてください。私はあなたが歯医者の名前に[]を置くことをお勧めします、それはあなたにエラーが発生し、または

public void FillCombo() 
    { 
     SqlConnection conn = new SqlConnection(@"Data Source = GGJG; Initial Catalog = DentistDB; Integrated Security = True"); 
     SqlCommand SelectCommand = new SqlCommand("SELECT * FROM DentistInfo", conn); 
     conn.Open(); 
     DataSet ds = new DataSet(); 
     SqlDataAdapter da = new SqlDataAdapter(SelectCommand); 
     da.fill(ds); 

     foreach(DataRow dr in ds.Tables[0].Rows) 
     { 
      comboBox1.Items.Add(dr["[Dentist Name]"].ToString()); 
     } 
     conn.Close(); 
    } 
をDentistNameするために、データベースから名前を変更する場合があります二つの単語の間にスペースを持っているので、あなたがそうのように使用して内部接続囲むことができ、最初のユーザーの答えとして代わりにconn.Open()とはconn.close()を使用しての追加を1として

、:

using(SqlConnection conn = new SqlConnection(@"Data Source = GGJG; Initial Catalog = DentistDB; Integrated Security = True")) 
{ 
    //your codes here no need for conn.Open() and conn.Close() 
} 
+0

もう一度お返事ありがとうございます。 JC Borlagdanのコードを入力しましたが、次のエラーが発生しました。引数1:System.Data.SqlClient.SqlComandからstringに変換できません。 このコードの下線が引かれています。DataSet ds = new DataSet(SelectCommand); []内のSelectCommandには下線が引かれています。 – Griff

+0

aaah私の悪い...編集された先生 –

+0

華麗なありがとうJC - 名前はコンボボックスに移入されました。 – Griff

1

プロヒント:あなたがエラーについて質問したい場合は、はエラーを投稿してください。

いずれにしても、問題はこの場合に見つけやすくなります。文字列を引数として受け取るGetStringのオーバーロードはありません。列インデックスのみを使用できます。

したがって、列インデックス(myreader.GetOrdinal("Dentist Name"))を渡す必要があるか、インデクサー()を使用する必要があります。いずれの場合も、可能なNULL値を適切に処理するようにしてください。SQL NULL値を読み取ろうとすると、データ・リーダーは単に例外をスローします。さておき、あなたのtry ... catchを簡素化することができる(そしてより有用)として

  • あなたは例外を再スローする場合、throw;(なし "引数")を使用。追加する情報がある場合にのみ、例外をラップします。
  • catch句は必要ありません。 finallyの場合にのみ使用しているようです。try ... finallycatchなしで使用すると問題はありません。
  • connは、最終節のnullになることはありません。tryは十分ではありません。
  • このようなパターンでは、とにかくtry ... finallyの代わりにusingを使用します。また、データリーダーにはusingを使用する必要があります。
+0

ヌルを扱うことができるものを読んでいる限り、データリーダーはヌルファンドを読むことができる。オブジェクトに読み込み、文字列かどうかをチェックし、文字列であればキャストします。 –

+0

@LorenPechtel「可能なNULL値を適切に処理する」として知られています。 'GetString'(およびfriends)がスローされると、インデクサーは' DBNull.Value'を返します。最も簡単で安価な方法は 'IsDBNull'メソッドを使うことです。 – Luaan

+0

すべての返信をありがとうございます。私はそれ以上の問題にエラーを囲むように保証します。私は家に帰るときに与えられた答えを試してみるつもりです。ちょうど私が理解する、それはヒットnull値であり、例外はありませんでした。 – Griff

関連する問題