尝试读取或写入受保护的内存.这通常表示其他内存已损坏.当使用OpenFileDialog时



我使用的是一个打开的文件对话框,它是我从工具箱拖到窗体上的。直到最近,文件对话框还可以正常工作。

我在网上到处找答案,但都不管用。我在家里的电脑上开始了这个项目,然后把整个项目文件夹复制到我的工作电脑上,这样我就可以在家里和工作中都使用它了。

即使现在在我的工作计算机上,文件对话框也能正常工作,但在我(在工作中)更改代码并将新的项目文件夹复制到家用计算机后,问题就会出现。这不是在TFS或任何其他共享位置中管理的。这是我正在进行的一个私人项目。问题发生的代码如下:

Thread th;        
private void btnUploadToDB_Click(object sender, EventArgs e)
{
try
{
openFileDialog1.Title = "Select new data file";
openFileDialog1.Filter = "Excel Files |*.xlsx";
if (openFileDialog1.ShowDialog() == DialogResult.OK)
{
string filePath = openFileDialog1.FileName;
}
else if (DialogResult == DialogResult.None)
{
return;
}
th = new Thread(uploadToDB);
Control.CheckForIllegalCrossThreadCalls = false;
th.Start();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
finally
{
GC.Collect();
}
}

错误发生时的堆栈跟踪如下:

System.AccessViolationException未处理消息=试图读取或写入受保护的内存。这通常表示其他内存已损坏。Source=System.Windows.FormsStackTrace:位于System.Windows.Forms.FileDialogNative.IFileDialog.Show(IntPtr父级)位于System.Windows.Forms.FileDialog.RunDialogVista(IntPtr hWndOwner)位于System.Windows.Forms.FileDialog.RunDialog(IntPtr hWndOwner)位于System.Windows.Forms.CommonDialog.ShowDialog(IWin32Window所有者)位于System.Windows.Forms.CommonDialog.ShowDialog()在C:\Users\User1\Documents\Visual Studio 2010\Projects\C#Projects\Solution 1\Solution 1\Form1.cs:line 458位于System.Windows.Forms.Control.OnClick(EventArgs e)位于System.Windows.Forms.Button.OnClick(EventArgs e)在System.Windows.Forms.Button.OnMouseUp(MouseEventArgs mevent)在System.Windows.Forms.Control.WmMouseUp(消息&m,鼠标按钮按钮,Int32次点击)位于System.Windows.Forms.Control.WndProc(消息&m)位于System.Windows.Forms.ButtonBase.WndProc(消息&m)位于System.Windows.Forms.Button.WndProc(消息&m)位于System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message&m)位于System.Windows.Forms.Control.ControlNativeWindow.WndProc(消息&m)在System.Windows.Forms.NativeWindow.DebugableCallback(IntPtr hWnd、Int32 msg、IntPtr wparam、IntPtr lparam)位于System.Windows.Forms.UnsafeNativeMethods.DispatchMessageW(MSG&MSG)位于System.Windows.Forms.Application.ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop(IntPtr dwComponentID,Int32 reason,Int32 pvLoopData)位于System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(Int32原因,ApplicationContext上下文)位于System.Windows.Forms.Application.ThreadContext.RunMessageLoop(Int32原因,ApplicationContext上下文)位于System.Windows.Forms.Application.Run(Form mainForm)位于C:\Users\User1\Documents\Visual Studio 2010\Projects\C#Projects\Solution 1\Solution 1\Program.cs:line 18中的Form1.Program.Main()位于System.AppDomain_nExecuteAssembly(RuntimeAssembly程序集,String[]参数)位于System.AppDomain.ExecuteAssembly(String assemblyFile,Evidence assemblySecurity,String[]args)位于Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()位于System.Threading.ThreadHelper.ThreadStart_Context(对象状态)在System.Threading.ExecutionContext.Run(ExecutionContext ExecutionContext,ContextCallback回调,对象状态,布尔ignoreSyncCtx)在System.Threading.ExecutionContext.Run(ExecutionContext ExecutionContext,ContextCallback回调,对象状态)位于System.Threading.ThreadHelper.ThreadStart()内部异常:

此外,我尝试在出现问题的家用电脑上创建一个空项目,并以相同的方式添加了一个openfiledialog,效果很好。问题似乎只出在这个应用程序上,当它在我的家用机器上时也是如此。

我正在根据请求添加updateToDB方法。我修改了一些值,所以可能会有一些行没有意义,但是,我认为这与手头的问题无关。

private void uploadToDB()
{
try
{
string values = "";
string excelConString = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source='" +
filePath + "'; Extended Properties='Excel 12.0 Xml;HDR=Yes;IMEX=1;'";
string excelSql = "select * from [Sheet1$]";
string accessConString = GlobalOleDBCommands.DBconString;
string accessSql = "delete from table1";
GlobalOleDBCommands.CommandExecuteNonQuery(accessSql, accessConString);
using (OleDbDataAdapter adap = new OleDbDataAdapter(excelSql, excelConString))
{
using (DataTable dt = new DataTable())
{
adap.Fill(dt);
using (OleDbConnection accessCon = new OleDbConnection(accessConString))
{
accessCon.Open();
for (int i = 0; i < dt.Rows.Count - 1; i++)
{
for (int j = 0; j <= dt.Columns.Count - 1; j++)
{
values = values.Trim() + dt.Rows[i][j] + ",";
}
values = Strings.Left(values, (Strings.Len(values) - 1));
string value1 = SplitAndReturnText(values, ",", 0);
string value2 = SplitAndReturnText(values, ",", 1);
string value3 = SplitAndReturnText(values, ",", 2);
string value4 = SplitAndReturnText(values, ",", 3);
accessSql = "insert into table1 (value1,value2,value3,value4) values(@value1,@value2,@value3,@value4)";
using (OleDbCommand dtToAccessCmd = new OleDbCommand(accessSql, accessCon))
{
dtToAccessCmd.Parameters.AddWithValue("@value1", value1);
dtToAccessCmd.Parameters.AddWithValue("@value2", value2);
dtToAccessCmd.Parameters.AddWithValue("@value3", System.Threading.Thread.CurrentThread.CurrentCulture.TextInfo.ToTitleCase(value3.ToLower()));
dtToAccessCmd.Parameters.AddWithValue("@value4", value4);
try
{
dtToAccessCmd.ExecuteNonQuery();
}
catch (Exception)
{
}
this.lblProgress.Text = (i + "/" + ((dt.Rows.Count) - 1)).ToString();
this.lblProgress.Refresh();
}
// Reset value variable to null.
values = "";
}
}
}
}
accessSql = "select max(end_time) from table1 where user_name='" +
Environment.UserName + "'";
DateTime start_time = Convert.ToDateTime(GlobalOleDBCommands.
CommandExecuteScalar(accessSql, GlobalOleDBCommands.DBconString));
DateTime end_time = DateTime.Now;
double total_time = (end_time - start_time).TotalMinutes;
string fieldValues = "start_time, end_time, user_name, task_name, total_time,task_count";
accessSql = "insert into table1 (" + fieldValues + ") values ('" +
start_time + "','" + DateTime.Now + "','" + Environment.UserName +
"','Update to DB','" + total_time + "','1')";
GlobalOleDBCommands.CommandExecuteNonQuery(accessSql, GlobalOleDBCommands.DBconString);
MessageBox.Show("New data added ");
this.lblProgress.Text = "";
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}

有人能告诉我是什么原因导致了这个问题吗?因为我无法在家里修改代码,因为担心当我转移到我的工作机器上时它不起作用。

要在部署计算机上运行代码,必须发生以下两件事之一1) 两台计算机上必须有完全相同版本的Net库,包括更新。2) 您必须在生成计算机上发布应用程序,然后运行在部署计算机上的生成计算机上创建的setup.exe文件夹。

你根本无法将exe从一台计算机复制到另一台计算机。

相关内容

最新更新