什么是PHP的mysql_fetch_array函数的C#等价物?

时间:2012-06-30 19:34:15

标签: c# sql equivalent

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

$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"]);
}

感谢。

5 个答案:

答案 0 :(得分:5)

我不确定这是否与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只展示了两个。

答案 1 :(得分: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"]);
}

答案 2 :(得分:0)

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

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

那是你想要的那种吗?

修改

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

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

答案 3 :(得分:0)

您需要连接到数据库。

假设您正在使用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和数据表,如果你想要一个表中的所有结果,你可以像数组一样使用。

答案 4 :(得分:0)

.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差不多。