1

一部の perl コードを C# に変換しようとしていますが、次のような問題が発生しています。

SQL Server 接続を確立して select ステートメントを実行した後、テーブル列のさまざまな要素を参照するにはどうすればよいですか。たとえば、Perl では次のようになります。

  my $dbh = DBI -> connect( NAME, USR, PWD )
            or die "Failed to connect to database: " . DBI->message;

  my $dbname = DB_NAME;
  my $dbschema = DB_SCHEMA;
  my $sql = qq{select a,b,c,d,e,f,g,h,i,...
             from $dbname.$dbschema.package p
             join $dbname.$dbschema.package_download pd on p.package_id = pd.package_id
             join $dbname.$dbschema.download d on pd.download_id = d.download_id
            where p.package_name = '$package'
              --and ds.server_address like 'tcp/ip'
            order by a,b,c,d,..};

  my $sth = $dbh -> prepare( $sql )
   or die "Failed to prepare statement: " . $dbh->message;

  $sth -> execute()
   or die "Failed to execute statement: " . $sth->message;

  #now to go through each row in result table

  while ( @data = $sth->fetchrow_array() )
  { 
    print "$data[0]";
    # If source server FTP is not already open, make new FTP
    if ( $data[0] != $src_id )
    {
        if ( $src_ftp )
        { $src_ftp -> quit; }
        $src_ftp = make_ftp( $data[1], $data[2], $data[3], $data[18], $data[19], $data[20] );
        $src_id = $data[0];
    } 
  }

これまでのところ、私はそれを手に入れました

string db =  NAME;
        string myConnectionString = "Data Source=ServerName;" + "Initial Catalog=" + db + "User id=" + ODBC_USR + "Password=" + PWD
        SqlConnection myConnection = new SqlConnection(myConnectionString);

     string myInsertQuery = "select a,b,c,d,e,f,g,h,i,...
             from $dbname.$dbschema.package p
             join $dbname.$dbschema.package_download pd on p.package_id = pd.package_id
             join $dbname.$dbschema.download d on pd.download_id = d.download_id
            where p.package_name = '$package'
              --and ds.server_address like 'tcp/ip'
            order by a,b,c,d,..";

     SqlCommand myCommand = new SqlCommand(myInsertQuery);
        myCommand.Connection = myConnection;
        myConnection.Open();
        myCommand.ExecuteNonQuery();
        myCommand.Connection.Close();

しかし、C# で data[0] や data[1] のような列を参照するにはどうすればよいでしょうか。申し訳ありませんが、私は両方の言語に慣れていないため、私のバックグラウンドが大幅に不足しています。ありがとう!

4

2 に答える 2

2

、、または特定の. _ _ _ 例として、ここでは DataTable を使用し、次のように名前を付けます。たとえば、最初の行を参照したい場合は、次の構文/形式で参照できます。DataTableDataSetDataReaderDataRowdt

dt[RowNumber]["ColumnName or Column Number"].ToString();

例えば:

dt[0]["a"].ToString();

または、次のように 0 の最初の列を数値で指定します。

dt[0][0].ToString();

ちなみに使用しないとSQL インジェクションParametersの影響を受けやすくなります。以下は、より完全なコードです。

 string db =  NAME;
 string myConnectionString = "Data Source=ServerName;" + "Initial Catalog=" + db + "User id=" + ODBC_USR + "Password=" + PWD

 using (SqlConnection connection = new SqlConnection(myConnectionString))
    {
      string mySelectQuery = @"SELECT a,b,c,d,e,f,g,h,i,...
         FROM package p
         JOIN package_download pd on p.package_id = pd.package_id
         join download d on pd.download_id = d.download_id
        WHERE p.package_name = @PackageName
        AND ds.server_address LIKE 'tcp/ip%'
        ORDER by a,b,c,d";

        try
        {
            connection.Open();
            using (SqlDataAdapter da = new SqlDataAdapter(mySelectQuery, connection))
            {

                using (SqlCommand cmd = new SqlCommand())
                {
                    da.SelectCommand.Parameters.AddWithValue("@PackageName", txtPackage.Text);

                        DataTable dt = new DataTable();
                        da.Fill(dt);         
                        if (dt.Rows.Count>0) // Make sure there is something in your DataTable
                         {
                           String aVal = dt[0]["a"].ToString();
                           String bVal = dt[0]["b"].ToString();
                           // You'll be the one to fill up
                         }                                                          
                }
            }

        }
        catch (Exception ex)
        {
          MessageBox.Show(ex.Message);
        }

    }

を使用するより適切な方法であなたを変更LIKE 'tcp/ip'します。LIKE 'tcp/ip%'LIKE

于 2013-07-27T04:39:38.557 に答える
0

ado.net エンティティ データ テーブルを使用して、SQL サーバー内のテーブルを参照できます。あなたがこれを正確に求めているかどうかはわかりませんが、役立つかもしれません。私の知る限り、SQLサーバーを直接参照することはできないためです。

于 2013-07-27T03:54:40.297 に答える