EF 连接到 MySQL 如何执行普通的查询??

时间:2022-08-17 17:38:17
由于我的数据库中有一部分表是动态生成的,因此没有为它生成实体类,在实际应用中是根据记录到表中的信息动态地生成create table, insert, update, delete, select 语句的

但是现在发现无法使用 EF 中得到的连接创建 DbCommand 进行普通的查询
using (DAL.PrintsysEntities db = new DAL.PrintsysEntities()) {
System.Data.Common.DbConnection conn = db.Connection;
using (System.Data.Common.DbCommand cmd = conn.CreateCommand()) {

cmd.CommandText = "select now()";

if (conn.State != ConnectionState.Open)
conn.Open();
using (System.Data.Common.DbDataReader reader = cmd.ExecuteReader()) {
if (reader.Read()) {
object now = reader.GetDateTime(0);
}
}
}
}


db.Connection 返回的是 System.Data.EntityClient.EntityConnection 类型 
用它得到的 Command 是 System.Data.EntityClient.EntityCommand 类型
用它们无法执行普通的 sql 语句

这个情况应该怎么办?

12 个解决方案

#1


怎么没人?自己顶一下

#2


db.Database.ExecuteSqlCommand();

#3


context.Database.SqlQuery<string>("select now()")

http://mhenrikson.blogspot.in/2011/06/execute-sql-with-entity-framework-4.html

#4


EntityCommand 是对应的数据库 Command 的代理,可直接运行sql代码,只是参数名称不能包含特殊符号(如@),因它会自动转换。

#6


引用 2 楼 huwei001982 的回复:
db.Database.ExecuteSqlCommand();


db 有 Database 这个属性,但是字是 string 类型,没有 ExecuteSqlCommand 这个方法啊

#7


引用 3 楼 q107770540 的回复:
context.Database.SqlQuery<string>("select now()")

http://mhenrikson.blogspot.in/2011/06/execute-sql-with-entity-framework-4.html


context.Database 是 string 类型,没有 SqlQuery 这个方法啊

#8


void Main() 

 
  var constr = @"Data Source=.;Initial Catalog=Northwind;Integrated Security=True"; 
  var context = new DataContext(constr) ; 
   
 string[] ss=context.ExecuteQuery<string>("select now()").ToArray(); 
 foreach(string s in ss) 
 { 
   Console.WriteLine(s); 
 } 
   
               
}
 

#9


因为EF无法使用sql语句,建议你建视图获取对象和数据.

不知道你的数据有没有什么特殊的?是否考虑过把动态表转换成实体表.?

#10


引用 9 楼 hdhai9451 的回复:
因为EF无法使用sql语句,建议你建视图获取对象和数据.

不知道你的数据有没有什么特殊的?是否考虑过把动态表转换成实体表.?


我的那部分表是动态生成的,在数据库里记录了这些表的表名以及它们的各个字段名、字段类型等信息,需要在程序运行时动态地创建查询语句。表的结构是客户在使用时订制的,程序开发时不可能知道最终运行时那些表叫什么,有哪些字段,字段时什么类型。

#11


引用 8 楼 q107770540 的回复:
void Main() 

 
  var constr = @"Data Source=.;Initial Catalog=Northwind;Integrated Security=True"; 
  var context = new DataContext(constr) ; 
   
 string[] ss=context.ExecuteQuery<string>("select now()").ToArray(); 
 foreach(string s in ss) 
 { 
   Console.WriteLine(s); 
 } 
   
               
}
 


版主,我用的是 MySQL,不是SQL Server
另外,这种查询要求指定返回类型,如果我查的不是当前时间,而是一个表,并且这个表是在运行时动态创建的,我就无法指定返回类型了。

#12


好象此题无解了,只能用 MySQL Ado.net

#1


怎么没人?自己顶一下

#2


db.Database.ExecuteSqlCommand();

#3


context.Database.SqlQuery<string>("select now()")

http://mhenrikson.blogspot.in/2011/06/execute-sql-with-entity-framework-4.html

#4


EntityCommand 是对应的数据库 Command 的代理,可直接运行sql代码,只是参数名称不能包含特殊符号(如@),因它会自动转换。

#5


#6


引用 2 楼 huwei001982 的回复:
db.Database.ExecuteSqlCommand();


db 有 Database 这个属性,但是字是 string 类型,没有 ExecuteSqlCommand 这个方法啊

#7


引用 3 楼 q107770540 的回复:
context.Database.SqlQuery<string>("select now()")

http://mhenrikson.blogspot.in/2011/06/execute-sql-with-entity-framework-4.html


context.Database 是 string 类型,没有 SqlQuery 这个方法啊

#8


void Main() 

 
  var constr = @"Data Source=.;Initial Catalog=Northwind;Integrated Security=True"; 
  var context = new DataContext(constr) ; 
   
 string[] ss=context.ExecuteQuery<string>("select now()").ToArray(); 
 foreach(string s in ss) 
 { 
   Console.WriteLine(s); 
 } 
   
               
}
 

#9


因为EF无法使用sql语句,建议你建视图获取对象和数据.

不知道你的数据有没有什么特殊的?是否考虑过把动态表转换成实体表.?

#10


引用 9 楼 hdhai9451 的回复:
因为EF无法使用sql语句,建议你建视图获取对象和数据.

不知道你的数据有没有什么特殊的?是否考虑过把动态表转换成实体表.?


我的那部分表是动态生成的,在数据库里记录了这些表的表名以及它们的各个字段名、字段类型等信息,需要在程序运行时动态地创建查询语句。表的结构是客户在使用时订制的,程序开发时不可能知道最终运行时那些表叫什么,有哪些字段,字段时什么类型。

#11


引用 8 楼 q107770540 的回复:
void Main() 

 
  var constr = @"Data Source=.;Initial Catalog=Northwind;Integrated Security=True"; 
  var context = new DataContext(constr) ; 
   
 string[] ss=context.ExecuteQuery<string>("select now()").ToArray(); 
 foreach(string s in ss) 
 { 
   Console.WriteLine(s); 
 } 
   
               
}
 


版主,我用的是 MySQL,不是SQL Server
另外,这种查询要求指定返回类型,如果我查的不是当前时间,而是一个表,并且这个表是在运行时动态创建的,我就无法指定返回类型了。

#12


好象此题无解了,只能用 MySQL Ado.net