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

值不能为空。 参数名: str

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();
                    }
  • 写回答

7条回答 默认 最新

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

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

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

    根据问题描述和错误信息,这是一个典型的"参数不能为空"异常,具体发生在处理Excel文件导入数据库的过程中。以下是分析和解决方案:

    问题分析

    1. 错误类型:ArgumentNullException,参数名为str
    2. 错误位置:myDa.Fill(myDs)方法调用时
    3. 根本原因:
      • 连接字符串可能为空或无效
      • Excel文件路径或名称可能为空
      • Sheet名称不正确(默认应为[Sheet1$])
      • 系统缺少MDAC组件

    解决方案

    case "fcxxmain":
        // 1. 首先检查文件是否上传成功
        if (FileUpload1.HasFile == false || string.IsNullOrEmpty(FileUpload1.FileName))
        {
            Label1.Text = "<script>alert('请选择要上传的文件');</script>";
            return;
        }
    
    
        string fullname = FileUpload1.FileName;
        string typ = Path.GetExtension(fullname).ToLower(); // 更安全的获取扩展名方式
        
        // 2. 验证文件类型
        if (typ != ".xls" && typ != ".xlsx")
        {
            Label1.Text = "<script>alert('只支持Excel文件(.xls,.xlsx)');</script>";
            return;
        }
    
    
        try
        {
            // 3. 创建上传目录(如果不存在)
            string uploadPath = Server.MapPath("~/upload/");
            if (!Directory.Exists(uploadPath))
            {
                Directory.CreateDirectory(uploadPath);
            }
    
    
            // 4. 保存文件
            string savePath = Path.Combine(uploadPath, FileUpload1.FileName);
            FileUpload1.SaveAs(savePath);
    
    
            // 5. 构建连接字符串(根据Excel版本)
            string connStr = typ == ".xls" 
                ? $"Provider=Microsoft.Jet.OLEDB.4.0;Data Source={savePath};Extended Properties='Excel 8.0;HDR=YES;IMEX=1'" 
                : $"Provider=Microsoft.ACE.OLEDB.12.0;Data Source={savePath};Extended Properties='Excel 12.0;HDR=YES;IMEX=1'";
    
    
            using (OleDbConnection cnnxls = new OleDbConnection(connStr))
            {
                cnnxls.Open(); // 显式打开连接
                
                // 6. 获取Sheet名称(更安全的方式)
                DataTable schemaTable = cnnxls.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null);
                if (schemaTable.Rows.Count == 0)
                {
                    Label1.Text = "<script>alert('Excel文件中没有工作表');</script>";
                    return;
                }
                
                string sheetName = schemaTable.Rows[0]["TABLE_NAME"].ToString();
                
                // 7. 填充数据
                DataSet myDs = new DataSet();
                OleDbDataAdapter myDa = new OleDbDataAdapter($"SELECT * FROM [{sheetName}]", cnnxls);
                myDa.Fill(myDs);
                
                // ... 后续数据库操作 ...
            }
        }
        catch (Exception ex)
        {
            Label1.Text = $"<script>alert('处理失败: {ex.Message.Replace("'", "")}');</script>";
        }
    

    关键改进点

    1. 文件验证:添加了文件存在性检查和类型验证
    2. 连接字符串:根据Excel版本使用不同的Provider
    3. Sheet名称:动态获取第一个Sheet名称而非硬编码
    4. 异常处理:更全面的错误捕获和用户提示
    5. 资源释放:使用using语句确保连接被正确释放

    系统要求检查

    开始

    常见问题排查

    1. 如果仍然报错,请检查:
      • IIS应用程序池身份是否有文件系统读写权限
      • 服务器是否安装了正确的Access Database Engine
      • 64位系统需要特别注意程序编译平台目标(x86/x64)

    建议在开发环境添加更详细的日志记录,以便快速定位问题。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(6条)

报告相同问题?

问题事件

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