ASP.NET MVC导入Excel至数据库时遇SqlConnection 'metadata'不支持错误
解决“Keyword not supported: 'metadata'”错误
这个问题我太熟了——你犯了一个非常常见的小失误:你把Entity Framework专用的实体连接字符串直接传给了SqlConnection,但SqlConnection只认纯ADO.NET的数据库连接字符串,完全不认识带metadata的EF连接串,这就是报错的根源。
问题拆解
你从ConfigurationManager.ConnectionStrings["RéceptionEntities"]拿到的连接串格式大概是这样的:
metadata=res://*/Models.MyModel.csdl|res://*/Models.MyModel.ssdl|res://*/Models.MyModel.msl;provider=System.Data.SqlClient;provider connection string="data source=...;initial catalog=...;integrated security=True;MultipleActiveResultSets=True;App=EntityFramework"
这里的metadata部分是EF用来映射实体模型的专属配置,SqlConnection根本不识别这个关键字,自然会抛出ArgumentException。
具体解决方案
1. 在配置文件中新增纯ADO.NET连接串
打开你的Web.config或App.config,找到<connectionStrings>节点,在原有EF连接串的基础上,添加一个不带metadata的纯数据库连接串:
<connectionStrings> <!-- 原有的EF实体连接串 --> <add name="RéceptionEntities" connectionString="metadata=..." providerName="System.Data.EntityClient" /> <!-- 新增的纯ADO.NET连接串 --> <add name="RéceptionADO" connectionString="data source=你的数据库服务器名;initial catalog=Réception;integrated security=True;MultipleActiveResultSets=True" providerName="System.Data.SqlClient" /> </connectionStrings>
2. 修改代码使用新连接串
把代码里获取连接串的逻辑换成新的纯ADO.NET连接串:
for (int i = 0; i < ds.Tables[0].Rows.Count; i++) { // 改用纯ADO.NET连接串 string conn = ConfigurationManager.ConnectionStrings["RéceptionADO"].ConnectionString; SqlConnection con = new SqlConnection(conn); string query = "Insert into Réception_camions(Date_d_arrivée,heure_..."; // 后续执行逻辑... }
额外优化建议
- 别在循环里反复创建
SqlConnection,建议把连接对象的创建移到循环外,并用using语句自动释放资源,避免连接泄漏:string conn = ConfigurationManager.ConnectionStrings["RéceptionADO"].ConnectionString; using (SqlConnection con = new SqlConnection(conn)) { con.Open(); for (int i = 0; i < ds.Tables[0].Rows.Count; i++) { string query = "Insert into Réception_camions(Date_d_arrivée,heure_..."; using (SqlCommand cmd = new SqlCommand(query, con)) { // 设置参数、执行命令 cmd.ExecuteNonQuery(); } } } - 尽量用参数化查询代替直接拼接SQL,既能防止SQL注入,也能避免日期、特殊字符串的格式问题。
内容的提问来源于stack exchange,提问作者M.LOOK
相关产品推荐
相关产品推荐

