fcxxfcxx 2025-06-16 15:31 采纳率: 75%
浏览 10
已结题

asp.net+sqlserver 运行时出错:值不能为空。

img

case "fcxxmain":

            string fullname = FileUpload1.FileName.ToString();
            string url = FileUpload1.PostedFile.FileName.ToString();
            string typ = fullname.Substring(fullname.LastIndexOf(".") + 1);
            if (typ == "xls")
            {

                FileUpload1.SaveAs(Server.MapPath("upload") + "\\" + FileUpload1.FileName);
                string mystring = "Provider = Microsoft.Jet.OLEDB.4.0 ; Data Source = " + Server.MapPath("upload") + "\\" + FileUpload1.FileName + ";Extended Properties=Excel 8.0";
                OleDbConnection cnnxls = new OleDbConnection(mystring);
                OleDbDataAdapter myDa = new OleDbDataAdapter("select * from [Sheet1$]", cnnxls);
                DataSet myDs = new DataSet();
                myDa.Fill(myDs);

                if (myDs.Tables[0].Rows.Count > 0)
                {
                    string strSql = "";
                    string CnnString = "Provider=SQLOLEDB;database=glxt;server=(local);uid=sa;pwd=hx666@888";
                    OleDbConnection conn = new OleDbConnection(CnnString);
                    conn.Open();
                    OleDbCommand myCmd = null;

                    for (int i = 0; i < myDs.Tables[0].Rows.Count; i++)
                    {
                        strSql = "insert into " + DropDownList1.SelectedValue + "(用户ID,类别,学校名称,姓名,密码) values ('";
                        strSql += myDs.Tables[0].Rows[i].ItemArray[0].ToString() + "', '";
                        strSql += myDs.Tables[0].Rows[i].ItemArray[1].ToString() + "', '";
                        strSql += myDs.Tables[0].Rows[i].ItemArray[2].ToString() + "', '";
                        strSql += myDs.Tables[0].Rows[i].ItemArray[3].ToString() + "', '";

                        strSql += myDs.Tables[0].Rows[i].ItemArray[4].ToString() + "')";



                        try
                        {
                            myCmd = new OleDbCommand(strSql, conn);
                            myCmd.ExecuteNonQuery();
                            Label1.Text = "<script language=javascript>alert('数据导入成功.');</script>";
                        }
                        catch
                        {
                            Label1.Text = "<script language=javascript>alert('数据导入失败.');</script>";
                        }
                    }
                    conn.Close();
                }

            }
            else
            {
                Response.Write("<script>alert('文件类型不正确,请重新选择!')</script>");
            }








            break;
  • 写回答

5条回答 默认 最新

  • 宝码香车 优质创作者: JavaScript技术领域 2025-06-16 15:43
    关注

    让【宝码香车】来帮你解答,本回答参考DeepSeek编写,并整理提供。

    如果还有疑问可以点击头像关注私信或评论。如果答案让您满意,请采纳、点赞、关注,非常感谢!

    ASP.NET + SQL Server 运行时错误:值不能为空

    根据您提供的错误信息和代码,问题出在读取Excel文件时出现了"值不能为空"的异常。以下是详细分析和解决方案:

    问题分析

    1. 错误发生在myDa.Fill(myDs)这一行,提示"值不能为空"。
    2. 从堆栈跟踪看,根本原因是缺少Microsoft Data Access Components(MDAC) 2.6或更高版本。
    3. 代码中使用了OleDb连接Excel文件,但连接字符串或文件路径可能有问题。

    解决方案

    1. 检查MDAC安装

    首先确保服务器上安装了MDAC 2.6或更高版本。可以通过以下方式检查:

    // 在代码中添加版本检查
    try
    {
        var version = System.Data.OleDb.OleDbEnumerator.GetRootEnumerator().GetType().Assembly.GetName().Version;
        if (version < new Version(2, 6))
        {
            throw new Exception("需要安装MDAC 2.6或更高版本");
        }
    }
    catch (Exception ex)
    {
        Label1.Text = $"<script>alert('MDAC检查失败: {ex.Message}')</script>";
        return;
    }
    

    2. 修正Excel连接字符串

    修改您的连接字符串,确保格式正确:

    string mystring = $"Provider=Microsoft.Jet.OLEDB.4.0;Data Source={Server.MapPath("upload")}\\{FileUpload1.FileName};Extended Properties=\"Excel 8.0;HDR=Yes;IMEX=1\"";
    

    3. 完整修正代码

    case "fcxxmain":
        if (!FileUpload1.HasFile)
        {
            Label1.Text = "<script>alert('请先选择文件')</script>";
            break;
        }
    
    
        string fullname = FileUpload1.FileName;
        string typ = Path.GetExtension(fullname).ToLower().TrimStart('.');
        
        if (typ == "xls")
        {
            try
            {
                // 确保upload目录存在
                string uploadPath = Server.MapPath("upload");
                if (!Directory.Exists(uploadPath))
                {
                    Directory.CreateDirectory(uploadPath);
                }
                
                // 保存文件
                string savePath = Path.Combine(uploadPath, FileUpload1.FileName);
                FileUpload1.SaveAs(savePath);
                
                // 连接字符串
                string connStr = $"Provider=Microsoft.Jet.OLEDB.4.0;Data Source={savePath};Extended Properties=\"Excel 8.0;HDR=Yes;IMEX=1\"";
                
                using (OleDbConnection cnnxls = new OleDbConnection(connStr))
                {
                    cnnxls.Open();
                    DataSet myDs = new DataSet();
                    OleDbDataAdapter myDa = new OleDbDataAdapter("SELECT * FROM [Sheet1$]", cnnxls);
                    myDa.Fill(myDs);
                    
                    if (myDs.Tables[0].Rows.Count > 0)
                    {
                        string CnnString = "Provider=SQLOLEDB;database=glxt;server=(local);uid=sa;pwd=hx666@888";
                        using (OleDbConnection conn = new OleDbConnection(CnnString))
                        {
                            conn.Open();
                            
                            for (int i = 0; i < myDs.Tables[0].Rows.Count; i++)
                            {
                                string strSql = $@"INSERT INTO {DropDownList1.SelectedValue} 
                                                (用户ID, 类别, 学校名称, 姓名, 密码) 
                                                VALUES (@id, @type, @school, @name, @pwd)";
                                
                                using (OleDbCommand myCmd = new OleDbCommand(strSql, conn))
                                {
                                    myCmd.Parameters.AddWithValue("@id", myDs.Tables[0].Rows[i][0]);
                                    myCmd.Parameters.AddWithValue("@type", myDs.Tables[0].Rows[i][1]);
                                    myCmd.Parameters.AddWithValue("@school", myDs.Tables[0].Rows[i][2]);
                                    myCmd.Parameters.AddWithValue("@name", myDs.Tables[0].Rows[i][3]);
                                    myCmd.Parameters.AddWithValue("@pwd", myDs.Tables[0].Rows[i][4]);
                                    
                                    try
                                    {
                                        myCmd.ExecuteNonQuery();
                                    }
                                    catch (Exception ex)
                                    {
                                        Label1.Text = $"<script>alert('第{i+1}行数据导入失败: {ex.Message}')</script>";
                                    }
                                }
                            }
                        }
                        Label1.Text = "<script>alert('数据导入成功.')</script>";
                    }
                    else
                    {
                        Label1.Text = "<script>alert('Excel文件中没有数据.')</script>";
                    }
                }
            }
            catch (Exception ex)
            {
                Label1.Text = $"<script>alert('处理失败: {ex.Message}')</script>";
            }
        }
        else
        {
            Label1.Text = "<script>alert('文件类型不正确,请选择.xls文件')</script>";
        }
        break;
    

    改进建议

    1. 使用参数化查询:避免SQL注入风险
    2. 添加异常处理:捕获并显示具体错误信息
    3. 检查文件存在性:上传前检查文件是否为空
    4. 使用using语句:确保数据库连接正确关闭
    5. 考虑使用EPPlus:对于新版Excel文件(.xlsx),建议使用EPPlus库

    错误排查流程

    开始

    如果问题仍然存在,请检查:

    1. Excel文件是否损坏
    2. Sheet名称是否正确(代码中是"Sheet1$")
    3. 服务器权限是否足够
    4. 文件路径是否包含特殊字符
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(4条)

报告相同问题?

问题事件

  • 系统已结题 6月25日
  • 已采纳回答 6月17日
  • 创建了问题 6月16日