2013-07-27 24 views
0

我試圖將一些Perl代碼轉換爲C#,並且遇到以下問題。如何引用C#中sql服務器連接的列

在建立sql服務器連接並執行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(); 

但如何引用列,如數據[0]和數據[1] C#。對不起,我是兩種語言的新手,所以我的背景嚴重缺乏。謝謝!

回答

0

您可以使用ado.net實體數據表來引用您的sql服務器中的表。我不知道你是否正在問這個問題,但可能會有所幫助。因爲直接引用到sql server是不可能的,據我所知。

2

您可以通過它列名直接引用您的列或數字順序(它從0開始的第一列)或者通過DataTableDataSetDataReader或特定DataRow。 例如起見,我會在這裏使用一個DataTable,我將它命名爲dt,讓我們說,我們要引用的第一行,那麼你可以用下面的語法/格式引用它:

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

對於例如:

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

或數字的第一列具有爲0,如:

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

並通過,因爲W上的方式使用Parameters沒有它會受到SQL Injection的影響。這裏是下面一個更完整的代碼:

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的更爲適宜的方式改變你的LIKE 'tcp/ip'LIKE 'tcp/ip%'