You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用System.Data.SqlClient遇程序集加载异常,寻求技术帮助

解决System.Data.SqlClient的BadImageFormatException问题

首先,咱们先明确你的问题:你编写了一个控制台程序用来将数据插入SQL Server数据库,但运行时抛出了System.BadImageFormatException,提示引用程序集不能被加载执行。

你的代码如下:

using System;
using System.Data.SqlClient;
namespace StudentDetails_Proj
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Enter Name:");
            string name = Console.ReadLine();
            Console.WriteLine("Enter Age:");
            string age = Console.ReadLine();
            Console.WriteLine("Enter Id:");
            string id = Console.ReadLine();
            Console.WriteLine("Enter Address:");
            string address = Console.ReadLine();
            // string connectionstring = "Server=G2W9DRV2E;Database=UserLogin;User Id=sa;Password=Password1";
            string connectionstring = "Server=G2W9DRV2E;Database=UserLogin;Integrated Security=true";
            SqlConnection connection = new SqlConnection(connectionstring);
            connection.Open();
            string cmdText = string.Format("Insert into StudentInfo values('{0}',{1},{2},'{3}')", name, age, id, address);
            SqlCommand cmd = new SqlCommand(cmdText, connection);
            cmd.ExecuteNonQuery();
            connection.Close();
        }
    }
}

遇到的异常:

Unhandled Exception: System.BadImageFormatException : Could not load file or assembly 'System.Data.SqlClient, Version=4.4.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a'. Reference assemblies should not be loaded for execution. They can only be loaded in the Reflection-only loader context. (Exception from HRESULT: 0x80131058)
System.BadImageFormatException : Cannot load a reference assembly for execution


问题原因分析

这个错误本质是程序集加载不匹配,常见触发场景有:

  • 项目目标框架和System.Data.SqlClient版本不兼容
  • 引用了仅用于编译的"引用程序集",而非可执行的运行时程序集
  • 项目平台目标(x86/x64/Any CPU)与SQL Server或系统环境不匹配
  • 在.NET Core/.NET 5+环境下使用了已进入维护状态的旧版System.Data.SqlClient

具体解决方案

1. 检查并调整项目目标框架

  • 如果是**.NET Framework**:确保目标框架版本不低于4.6.1(System.Data.SqlClient在这个版本后有稳定支持),且无需单独安装NuGet包——它是框架内置组件。右键项目→属性→应用→目标框架,选择合适版本即可。
  • 如果是**.NET Core/.NET 5+**:System.Data.SqlClient已被官方标记为维护状态,建议直接切换到Microsoft.Data.SqlClient(官方替代方案),同时确保NuGet包版本与目标框架兼容。

2. 修复NuGet包引用(若使用了NuGet)

  • 右键项目→管理NuGet程序包,找到System.Data.SqlClient先卸载。
  • .NET Framework项目直接移除NuGet引用即可(用框架内置版本);.NET Core/.NET 5+项目安装Microsoft.Data.SqlClient最新稳定版,然后将代码里的using System.Data.SqlClient;改为using Microsoft.Data.SqlClient;。

3. 调整项目平台目标

  • 右键项目→属性→生成→平台目标,根据SQL Server位数选择:
    • SQL Server是32位则选x86
    • 64位则选x64
    • 也可选Any CPU,但64位系统下取消勾选"首选32位"

4. 修复SQL注入风险(重要!)

你的代码用string.Format拼接SQL语句,存在严重SQL注入漏洞,必须改成参数化查询,还能避免数据格式错误。修改后的示例代码:

using System;
using Microsoft.Data.SqlClient; // 或System.Data.SqlClient,依你使用的包而定
namespace StudentDetails_Proj
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Enter Name:");
            string name = Console.ReadLine();
            Console.WriteLine("Enter Age:");
            if (!int.TryParse(Console.ReadLine(), out int age))
            {
                Console.WriteLine("年龄输入无效!");
                return;
            }
            Console.WriteLine("Enter Id:");
            if (!int.TryParse(Console.ReadLine(), out int id))
            {
                Console.WriteLine("ID输入无效!");
                return;
            }
            Console.WriteLine("Enter Address:");
            string address = Console.ReadLine();

            string connectionstring = "Server=G2W9DRV2E;Database=UserLogin;Integrated Security=true";
            // 使用using语句自动释放资源,避免手动Close遗漏
            using (SqlConnection connection = new SqlConnection(connectionstring))
            {
                connection.Open();
                string cmdText = "Insert into StudentInfo values(@Name, @Age, @Id, @Address)";
                using (SqlCommand cmd = new SqlCommand(cmdText, connection))
                {
                    cmd.Parameters.AddWithValue("@Name", name);
                    cmd.Parameters.AddWithValue("@Age", age);
                    cmd.Parameters.AddWithValue("@Id", id);
                    cmd.Parameters.AddWithValue("@Address", address);
                    cmd.ExecuteNonQuery();
                }
            }
            Console.WriteLine("数据插入成功!");
        }
    }
}

内容的提问来源于stack exchange,提问作者Vishal Gupta

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 06:44:12