我正在学习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"]);
}
感谢。
答案 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(如上所示)。
您可以使用自动加载的自定义类,DataReader
或DataTable
自动加载架构。
例如(这里使用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差不多。