【问题标题】:What is C# equivalent of PHP's mysql_fetch_array function?什么是 PHP 的 mysql_fetch_array 函数的 C# 等效项?
【发布时间】:2012-06-30 19:34:14
【问题描述】:

我正在学习 C#/ASP.NET,我想知道以下 PHP 代码的 C# 等价物是什么? 我知道用户 ID,我想从这个表中获取行到变量“row”的数组中,所以我可以将它用作“row['name']”和“row['email']。

$result = mysql_query("SELECT email, name FROM mytable WHERE id=7");

while ($row = mysql_fetch_array($result, MYSQL_ASSOC)) {
    printf("Email: %s  Name: %s", $row["email"], $row["name"]);
}

谢谢。

【问题讨论】:

  • 为什么需要行。 .Net 通常是 IDataReader 或 Datatable 甚至更现代的集合。不要尝试创建 PHP.Net,你会很快陷入困境。
  • 我根本不需要行,我在帖子中的意思是展示我将如何在 PHP 中做到这一点,问题是什么是等价的?我的意思不是让它尽可能相似,但我将如何在 C# 中获得相同的最终结果(带有结果的变量)?
  • 也许我最初的问题有点不清楚或者问得不是很好,但我希望你能理解我的潜在意图:)

标签: c# sql equivalent


【解决方案1】:

我不确定这是否与mysql_fetch_array 相同,但我认为是这样。 您可以使用 IDBCommmand.ExecuteReader 创建一个 IDataReader 并使用它来使用该行的所有字段填充 Object[]

例如(使用 SQL-Server):

// use using statements to ensure that connections are disposed/closed (all implementing IDisposable)
using (var con = new SqlConnection(Properties.Settings.Default.ConnectionString))
using (var cmd = new SqlCommand("SELECT email, name FROM mytable WHERE id=@id", con))
{
    cmd.Parameters.AddWithValue("@id", ID);  // use parameters to avoid sql-injection
    con.Open();
    using (var reader = cmd.ExecuteReader())
    {
        while (reader.Read())
        { 
            var fields = new object[reader.FieldCount];
            // following fills an object[] with all fields of the current line, 
            // is this similar to mysql_fetch_array?
            int count  = reader.GetValues(fields);
        }
    }
}

编辑

我的意思不是让它尽可能相似,但我将如何在 C# 中获得相同的最终结果(带有结果的变量)

这是一个品味问题。您可以使用某种 ORM,例如 Enity-Framework、NHibernate、LINQ-To-SQL 或 Stackoverflow 的 Micro-ORM Dapper.NET(我目前正在使用的)或普通的 ADO.NET(如上所示)。

您可以使用您手动填充的自定义类,其中包含自动加载架构的 DataReaderDataTable

例如(这里使用 MySQL):

DataTable tblEmail = new DataTable();
using (var con = new MySqlConnection(Properties.Settings.Default.MySQL))
using (var da = new MySqlDataAdapter("SELECT Email, Name FROM Email WHERE id=@id", con))
{
    da.SelectCommand.Parameters.AddWithValue("@id", ID);
    da.Fill(tblEmail);
}

if (tblEmail.Rows.Count == 1)
{
    DataRow row  = tblEmail.Rows[0];
    String email = row.Field<String>("Email");
    String name  = row.Field<String>("Name");
}

如您所见,.NET 中有很多方法。我只用 ADO.NET 展示了两个。

【讨论】:

    【解决方案2】:

    没有真正的等价物。作为过去的 PHP 开发人员,我想说最接近的事情是使用数据适配器并填充数据表。这是对DbDataAdapter.Fill 的引用。

    我不确定 MySql 驱动程序,但如果您使用的是 Sql Server,这里有一些代码可以帮助您入门:

    using (var connection = new SqlConnection(connectionString))
    {
        var table = new DataTable("tbl_objects");
        var adapter = new SqlDataAdapter();
        adapter.SelectCommand = new SqlCommand("SELECT * FROM tbl_name", connection);
        adapter.Fill(table);
    }
    

    然后,您可以遍历表中的行:

    foreach(var row in table)
    {
        Console.WriteLine("{0}", row["ColumnName"]);
    }
    

    【讨论】:

      【解决方案3】:

      您可以使用 foreach 循环遍历结果,如下所示:

        foreach(var row in result)
        { 
            console.writeline("Email:" + row.Email, "Name:", row.Name);
        }
      

      这就是你要找的东西吗?

      编辑

      事实上我刚刚看到你只有一个结果。

      然后你可以完全跳过foreach循环

      【讨论】:

        【解决方案4】:

        您需要连接到数据库。

        假设您使用的是 mysql 和 odbc 连接。

        var connectionString = "DRIVER={MySQL ODBC 3.51 Driver};" +
                             "SERVER=localhost;" +
                             "DATABASE=test;" +
                             "UID=venu;" +
                             "PASSWORD=venu;" +
                             "OPTION=3");
        
        
        using (OdbcConnection connection = new OdbcConnection(connectionString))
        {
            OdbcCommand command = new OdbcCommand("SELECT email, name FROM mytable WHERE id=7", connection);
        
            connection.Open();
        
            // Execute the DataReader and access the data.
            OdbcDataReader reader = command.ExecuteReader();
            while (reader.Read())
            {
                //do stuff with the data here row by row the reader is a cursor
            }
        
            // Call Close when done reading.
            reader.Close();
        

        如果您希望将所有结果放在一个可以像数组一样使用的表中,您也可以使用 odbcdataadapter 和数据表。

        【讨论】:

          【解决方案5】:

          .net 中最接近的等价物是这样的......

          using System;
          using System.Collections.Generic;
          using System.Linq;
          using System.Text;
          using MySql.Data.MySqlClient;
          
          namespace ConsoleApplication5
          {
              class Program
              {
                  static void Main(string[] args)
                  {
                      var foo = MySqlHelper.ExecuteDataRow("Server=myServerAddress;Database=myDataBase;Uid=myUsername;Pwd=myPassword;", "select * from foo");
                      Console.WriteLine(foo["Column"]);
                  }
              }
          }
          

          我假设您使用的是 MySql 数据连接器http://dev.mysql.com/downloads/connector/net/

          请注意,.net 中有更好的方法可以连接到数据库,但我认为逐行来说,这与 PHP 差不多。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2015-10-04
            • 2012-08-03
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2021-12-25
            • 2012-07-18
            相关资源
            最近更新 更多