2016-03-24 27 views
0

私はVB.NETで新しく、VB.NETでSQLクエリを実行しようとしていますが、出力には値が表示されません。私が間違っているところを見つけるのを手伝ってください。SQLクエリが実行中ではありません。VB.NET

Dim sConnectionString As String _ 
    = "User ID=XXX ;Password=XXX;Initial Catalog=gemXXX;Data Source=SCRBAMSDKBXXXXXX" 

    Dim objConn As New SqlConnection(sConnectionString) 
    objConn.Open() 

    Dim sw ,readerObj 
    Dim sSQL As String = "select top 1 " & sw & " = e.import from tblrelcoms r , [beant].[dbo].tblequipments e where r.IDEquipment = e.IDEquipment" 
    Using readerObj As SqlClient.SqlDataReader = cmdObj.ExecuteReader 
    Dim objCmd As New SqlCommand(sSQL, objConn) 
    objCmd.ExecuteNonQuery() 

    TextBox1.Text = sw.ToString() 
+1

あなたのvar 'sw'はあなたに値を与えません... –

+2

オプション厳密を有効にします – Plutonix

+0

ExecuteNonQueryはデータを返さないクエリを実行するために使用されます。 – Dejan

答えて

2

あなたが持っている問題は、あなただけのSQLに変数を連結し、SQLが実行されると、それが更新されることを期待することはできませんということです。

は、ExecuteScalarはおそらくあなたが望むものを達成するための最も簡単な方法です:

Dim sConnectionString As String _ 
    = "User ID=XXX ;Password=XXX;Initial Catalog=gemXXX;Data Source=SCRBAMSDKBXXXXXX" 

Dim sSQL as string = "SELECT TOP 1 e.import " _ 
        "FROM tblrelcoms r " & _ 
        "  INNER JOIN [beant].[dbo].tblequipments e " & _ 
        "   ON r.IDEquipment = e.IDEquipment " & _ 
        "ORDER BY e.Import;" 

Using connection = new SqlConnection(sConnectionString) 
    Using command = New SqlCommand(sSQL, connection) 

     connection.Open() 
     TextBox1.Text = command.ExecuteScalar().ToString() 

    End Using 
End Using 

あなたが複数の列が必要な場合は、その後、あなたは、データリーダーを使用できますが:

Dim sConnectionString As String _ 
    = "User ID=XXX ;Password=XXX;Initial Catalog=gemXXX;Data Source=SCRBAMSDKBXXXXXX" 

Dim sSQL as string = "SELECT TOP 1 e.import " _ 
        "FROM tblrelcoms r " & _ 
        "  INNER JOIN [beant].[dbo].tblequipments e " & _ 
        "   ON r.IDEquipment = e.IDEquipment " & _ 
        "ORDER BY e.Import;" 

Using connection = new SqlConnection(sConnectionString) 
    Using command = New SqlCommand(sSQL, connection) 

     connection.Open() 
     Using reader = command.ExecuteReader() 

      If reader.Read() 
       TextBox1.Text = reader.GetString(0) 
      End If 
     End Using 

    End Using 
End Using 

を私が作りました他にもいくつかの変更点があります。

  1. IDisposableオブジェクトを正しく廃棄するためのブロックが追加されました。
  2. 使用している構文が24年以上経過していることを示す名前として、ANSI 89の暗黙的な結合からANSIの92の明示的な結合にsql結合構文が更新されました。新しい構文の使用を開始する理由はたくさんあります。Bad habits to kick : using old-style JOINs
  3. SQLにORDER BY句を追加しました。 TOP 1

(あなたが唯一のケースのトップ1が冗長であるレコードを、持っていない限り)あなたは不確定な結果が得られます順なく、より複雑なソリューションが動作しますれ、出力パラメータを使用することで、ラインでより多くを思わでしょうあなたはもともと達成しようとしたが、(私の意見では)このような状況のためにやり過ぎたものと:

Dim sConnectionString As String _ 
    = "User ID=XXX ;Password=XXX;Initial Catalog=gemXXX;Data Source=SCRBAMSDKBXXXXXX" 

Dim sSQL as string = "SELECT TOP 1 @Output = e.import " _ 
        "FROM tblrelcoms r " & _ 
        "  INNER JOIN [beant].[dbo].tblequipments e " & _ 
        "   ON r.IDEquipment = e.IDEquipment " & _ 
        "ORDER BY e.Import;" 

Using connection = new SqlConnection(sConnectionString) 
    Using command = New SqlCommand(sSQL, connection) 

     connection.Open() 
     Dim p As SqlParameter = command.Parameters.Add("@Output", SqlDbType.VarChar, 255) 
     p.Direction = ParameterDirection.InputOutput 

     command.ExecuteNonQuery(); 

     TextBox1.Text = p.Value.ToString() 

    End Using 
End Using 

*構文エラーを言い訳してください、私は年間でVB.Netを使用して、いくつかのC#の癖していませんパラメータのないメソッドに括弧を使用する必要がない場合、またはできない場合は覚えていないなど、以下のようになる可能性があります。うまくいけば、あなたが始めるのに十分な基本構造です。

+0

素晴らしい例ですが、これはOPのために働くでしょう!実際に 'using'ステートメントを使ってくれてありがとう、私はこれを見ないと何度もあります... – Codexer

関連する問題