程序代码如下
private void Button_Click(object sender, RoutedEventArgs e)
{
string fName = "";
DataTable dt1 = new DataTable();
//用于获取excel文件名
Microsoft.Win32.OpenFileDialog open = new Microsoft.Win32.OpenFileDialog();
//open.Filter = "Excel(*.xlsx)|*.xlsx|Excel(*.xls)|*.xls";
if (open.ShowDialog() == true)
{
fName = open.FileName;
}
MessageBox.Show(fName);
}
在运行时一直提示“System.AccessViolationException: 尝试读取或写入受保护的内存”,怎么修改代码都不行,最后终于找到问题,Button_Click是在子窗体的一个事件,子窗口调用Win32的OpenFileDialog时就会出错。
后来经过试验,每次调用完子窗体后再调用ShowDialg就会出错。
网上找相关异常资料,普遍建议是:netsh winsock reset,作用是重置 Winsock 目录。按照建议重置也不行。
经过代码一条条测试,只要打开的主窗口或子窗口中有数据库连接conn.open()操作,再打开ShowDialag()就会出错,用过conn再释放资源也不行,而页面初始化时有绑定数据库操作,却没有问题。
解决办法: “Provider=Microsoft.ACE.OLEDB.12.0; Data Source=C:\DbTest\Test.accdb; OLE DB Services=-1” ;
在数据库连接中加上(OLE DB Services=-1),打开文件就不会再提示 :未处理 accesViolatinException 尝试读取或写入受保护的内存