[Access] C#通过COM组件访问Access文件
说明: 1,采用dynamic调用COM组件,适用于.NET 4.0以上支持dynamic版本的才可以; 2,执行速度不敢恭维,只是因为要用于Silverlight OOB模式中才研究一二; 3,测试环境 .net 4.5 + Silverlight 5.0 + Visual Studio 2013 4,见如下helper类(需引用 using
说明:
1,采用dynamic调用COM组件,适用于.NET 4.0以上支持dynamic版本的才可以;
2,执行速度不敢恭维,只是因为要用于Silverlight OOB模式中才研究一二;
3,测试环境.net 4.5 + Silverlight 5.0 + Visual Studio 2013
4,见如下helper类(需引用using System.Runtime.InteropServices.Automation;):
<span> 1</span> <span>public</span> <span>class</span><span> SLAccessHelper </span><span> 2</span> <span>{ </span><span> 3</span> <span>private</span> dynamic m_AccessApp;<span>//</span><span> Access.Application</span> <span> 4</span> <span>private</span> dynamic m_Database;<span>//</span><span> Database</span> <span> 5</span> <span>private</span><span> dynamic m_Recordset; </span><span> 6</span> <span> 7</span> <span>///</span> <span><summary></summary></span> <span> 8</span> <span>///</span><span> 构造函数 </span><span> 9</span> <span>///</span> <span></span> <span> 10</span> <span>///</span> <span><param name="visible"></span><span>Access是否可见</span><span></span> <span> 11</span> <span>public</span> SLAccessHelper(<span>bool</span><span> visible) </span><span> 12</span> <span> { </span><span> 13</span> m_AccessApp = AutomationFactory.CreateObject(<span>"</span><span>Access.Application</span><span>"</span><span>); </span><span> 14</span> m_AccessApp.Visible =<span> visible; </span><span> 15</span> <span> } </span><span> 16</span> <span> 17</span> <span>///</span> <span><summary></summary></span> <span> 18</span> <span>///</span><span> 打开数据库 </span><span> 19</span> <span>///</span> <span></span> <span> 20</span> <span>///</span> <span><param name="filePath"></span><span>Access数据库文件路径</span><span></span> <span> 21</span> <span>///</span> <span><param name="exclusive"></span><span>是否共享</span><span></span> <span> 22</span> <span>///</span> <span><param name="bstrPassword"></span><span>密码</span><span></span> <span> 23</span> <span>public</span> <span>void</span> OpenDb(<span>string</span> filePath, <span>bool</span> exclusive = <span>false</span>, <span>string</span> bstrPassword = <span>""</span><span>) </span><span> 24</span> <span> { </span><span> 25</span> <span> m_AccessApp.OpenCurrentDatabase(filePath, exclusive, bstrPassword); </span><span> 26</span> m_Database =<span> m_AccessApp.CurrentDb(); </span><span> 27</span> <span> } </span><span> 28</span> <span> 29</span> <span>///</span> <span><summary></summary></span> <span> 30</span> <span>///</span><span> 获取当前数据库中所有表名称集合 </span><span> 31</span> <span>///</span> <span></span> <span> 32</span> <span>///</span> <span><returns></returns></span><span>所有表名称集合</span><span></span> <span> 33</span> <span>public</span> Liststring><span> GetTableNames() </span><span> 34</span> <span> { </span><span> 35</span> Liststring> tableNames = <span>new</span> Liststring><span>(); </span><span> 36</span> dynamic tableDefs =<span> m_Database.TableDefs; </span><span> 37</span> <span>foreach</span> (dynamic tableDef <span>in</span><span> tableDefs) </span><span> 38</span> <span> { </span><span> 39</span> <span> tableNames.Add(tableDef.Name); </span><span> 40</span> <span> } </span><span> 41</span> <span> 42</span> <span>return</span><span> tableNames; </span><span> 43</span> <span> } </span><span> 44</span> <span> 45</span> <span>///</span> <span><summary></summary></span> <span> 46</span> <span>///</span><span> 加载表数据 </span><span> 47</span> <span>///</span> <span></span> <span> 48</span> <span>///</span> <span><param name="tableName"></span><span>表名称</span><span></span> <span> 49</span> <span>///</span> <span><returns></returns></span><span>表数据</span><span></span> <span> 50</span> <span>public</span> List<list>string>> LoadTable(<span>string</span><span> tableName) </span><span> 51</span> <span> { </span><span> 52</span> dynamic recordSet =<span> m_Database.OpenRecordset(tableName); </span><span> 53</span> <span>int</span> fieldsCount =<span> recordSet.Fields.Count; </span><span> 54</span> List<list>string>> data = <span>new</span> List<list>string>><span>(); </span><span> 55</span> <span>if</span> (fieldsCount > <span>0</span><span>) </span><span> 56</span> <span> { </span><span> 57</span> <span>try</span> <span> 58</span> <span> { </span><span> 59</span> Liststring> fieldNames = <span>new</span> Liststring><span>(); </span><span> 60</span> <span>for</span> (<span>int</span> i = <span>0</span>; i ) <span> 61</span> <span> { </span><span> 62</span> <span> fieldNames.Add(recordSet.Fields[i].Name); </span><span> 63</span> <span> } </span><span> 64</span> <span> data.Add(fieldNames); </span><span> 65</span> <span>if</span> (!<span>recordSet.EOF) </span><span> 66</span> <span> { </span><span> 67</span> <span> recordSet.MoveFirst(); </span><span> 68</span> <span>while</span> (!<span>recordSet.EOF) </span><span> 69</span> <span> { </span><span> 70</span> <span>object</span>[] dataRow = recordSet.GetRows();<span>//</span><span> 返回一维数组</span> <span> 71</span> Liststring> dataRowStr = <span>new</span> Liststring><span>(); </span><span> 72</span> <span>for</span> (<span>int</span> i = <span>0</span>; i ) <span> 73</span> <span> { </span><span> 74</span> dataRowStr.Add(dataRow[i] == <span>null</span> ? <span>""</span><span> : dataRow[i].ToString()); </span><span> 75</span> <span> } </span><span> 76</span> <span> data.Add(dataRowStr); </span><span> 77</span> <span> } </span><span> 78</span> <span> } </span><span> 79</span> <span> } </span><span> 80</span> <span>catch</span><span> (Exception ex) </span><span> 81</span> <span> { </span><span> 82</span> <span>throw</span> <span>new</span><span> Exception(ex.Message); </span><span> 83</span> <span> } </span><span> 84</span> <span>finally</span> <span> 85</span> <span> { </span><span> 86</span> <span>if</span> (recordSet != <span>null</span><span>) </span><span> 87</span> <span> { </span><span> 88</span> <span> recordSet.Close(); </span><span> 89</span> <span> ((IDisposable)recordSet).Dispose(); </span><span> 90</span> recordSet = <span>null</span><span>; </span><span> 91</span> <span> } </span><span> 92</span> <span> } </span><span> 93</span> <span> } </span><span> 94</span> <span> 95</span> <span>return</span><span> data; </span><span> 96</span> <span> } </span><span> 97</span> <span> 98</span> <span>///</span> <span><summary></summary></span> <span> 99</span> <span>///</span><span> 添加新纪录 </span><span>100</span> <span>///</span> <span></span> <span>101</span> <span>///</span> <span><param name="tableName"></span><span>表格名称</span><span></span> <span>102</span> <span>///</span> <span><param name="data"></span><span>数据</span><span></span> <span>103</span> <span>public</span> <span>void</span> AddNewRecord(<span>string</span> tableName, List<dictionary>string, <span>object</span>>><span> data) </span><span>104</span> <span> { </span><span>105</span> <span>try</span> <span>106</span> <span> { </span><span>107</span> m_Recordset = m_Database.OpenRecordset(tableName, <span>1</span>);<span>//</span><span> 1=RecordsetTypeEnum.dbOpenTable</span> <span>108</span> <span>int</span> fieldsCount =<span> m_Recordset.Fields.Count; </span><span>109</span> Liststring> fieldNames = <span>new</span> Liststring><span>(); </span><span>110</span> <span>for</span> (<span>int</span> i = <span>0</span>; i ) <span>111</span> <span> { </span><span>112</span> <span> fieldNames.Add(m_Recordset.Fields[i].Name); </span><span>113</span> <span> } </span><span>114</span> <span>for</span> (<span>int</span> rowIndex = <span>0</span>; rowIndex ) <span>115</span> <span> { </span><span>116</span> <span> m_Recordset.AddNew(); </span><span>117</span> <span>foreach</span> (<span>string</span> fieldName <span>in</span><span> fieldNames) </span><span>118</span> <span> { </span><span>119</span> m_Recordset.Fields[fieldName].Value =<span> data[rowIndex][fieldName]; </span><span>120</span> <span> } </span><span>121</span> <span> m_Recordset.Update(); </span><span>122</span> <span> } </span><span>123</span> <span> } </span><span>124</span> <span>catch</span><span>(Exception ex) </span><span>125</span> <span> { </span><span>126</span> <span>throw</span> <span>new</span><span> Exception(ex.Message); </span><span>127</span> <span> } </span><span>128</span> <span>finally</span> <span>129</span> <span> { </span><span>130</span> <span>if</span> (m_Recordset != <span>null</span><span>) </span><span>131</span> <span> { </span><span>132</span> <span> m_Recordset.Close(); </span><span>133</span> <span> ((IDisposable)m_Recordset).Dispose(); </span><span>134</span> m_Recordset = <span>null</span><span>; </span><span>135</span> <span> } </span><span>136</span> <span> } </span><span>137</span> <span> } </span><span>138</span> <span>139</span> <span>///</span> <span><summary></summary></span> <span>140</span> <span>///</span><span> 更新表格数据 </span><span>141</span> <span>///</span> <span></span> <span>142</span> <span>///</span> <span><param name="tableName"></span><span>表格名称</span><span></span> <span>143</span> <span>///</span> <span><param name="data"></span><span>数据</span><span></span> <span>144</span> <span>public</span> <span>void</span> UpdateTable(<span>string</span> tableName, List<dictionary>string, <span>string</span>>><span> data) </span><span>145</span> <span> { </span><span>146</span> <span>try</span> <span>147</span> <span> { </span><span>148</span> m_Recordset = m_Database.OpenRecordset(tableName, <span>1</span>);<span>//</span><span> 1=RecordsetTypeEnum.dbOpenTable</span> <span>149</span> <span> m_Recordset.MoveFirst(); </span><span>150</span> <span>for</span> (<span>int</span> rowIndex = <span>0</span>; rowIndex ) <span>151</span> <span> { </span><span>152</span> <span> m_Recordset.Edit(); </span><span>153</span> <span>foreach</span> (<span>string</span> fieldName <span>in</span><span> data[rowIndex].Keys) </span><span>154</span> <span> { </span><span>155</span> m_Recordset.Fields[fieldName].Value =<span> data[rowIndex][fieldName]; </span><span>156</span> <span> } </span><span>157</span> <span> m_Recordset.Update(); </span><span>158</span> <span> m_Recordset.MoveNext(); </span><span>159</span> <span> } </span><span>160</span> <span> } </span><span>161</span> <span>catch</span><span> (Exception ex) </span><span>162</span> <span> { </span><span>163</span> <span>throw</span> <span>new</span><span> Exception(ex.Message); </span><span>164</span> <span> } </span><span>165</span> <span>finally</span> <span>166</span> <span> { </span><span>167</span> <span>if</span> (m_Recordset != <span>null</span><span>) </span><span>168</span> <span> { </span><span>169</span> <span> m_Recordset.Close(); </span><span>170</span> <span> ((IDisposable)m_Recordset).Dispose(); </span><span>171</span> m_Recordset = <span>null</span><span>; </span><span>172</span> <span> } </span><span>173</span> <span> } </span><span>174</span> <span> } </span><span>175</span> <span>176</span> <span>///</span> <span><summary></summary></span> <span>177</span> <span>///</span><span> 关闭 </span><span>178</span> <span>///</span> <span></span> <span>179</span> <span>public</span> <span>void</span><span> Close() </span><span>180</span> <span> { </span><span>181</span> <span>if</span> (m_Database != <span>null</span><span>) </span><span>182</span> <span> { </span><span>183</span> <span> m_Database.Close(); </span><span>184</span> <span> ((IDisposable)m_Database).Dispose(); </span><span>185</span> m_Database = <span>null</span><span>; </span><span>186</span> <span> } </span><span>187</span> <span>if</span> (m_AccessApp != <span>null</span><span>) </span><span>188</span> <span> { </span><span>189</span> <span> m_AccessApp.CloseCurrentDatabase(); </span><span>190</span> <span>//</span><span> m_AccessApp.Quit();</span><span>//</span><span> 导致最后会弹出Access主页面</span> <span>191</span> <span> ((IDisposable)m_AccessApp).Dispose(); </span><span>192</span> m_AccessApp = <span>null</span><span>; </span><span>193</span> <span> } </span><span>194</span> <span> GC.Collect(); </span><span>195</span> <span> } </span><span>196</span> }</dictionary></dictionary></list></list></list>
通过dynamic构建的COM对象,在使用完成后都要手动关闭销毁,比如代码中的m_AccessApp, m_Database, m_Recordset三个对象,否则只是将m_AccessApp关闭清空释放掉,Access进程还是无法关闭,在程序关闭之前,始终都会有一个空白的无法关闭的Access界面;
在循环中处理dynamic和C#类型转换会降低程序执行效率,就比如像GetTableNames方法中循环遍历表名,都要花两三秒时间,所以尽量像object[] dataRow = recordSet.GetRows();直接获取其中的所有数据,然后再遍历处理,会极大提高执行效率;
要修改Access中的数据时,一定要先m_Recordset.Edit();才会允许你编辑其中的内容;

핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

Video Face Swap
완전히 무료인 AI 얼굴 교환 도구를 사용하여 모든 비디오의 얼굴을 쉽게 바꾸세요!

인기 기사

뜨거운 도구

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전
중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

드림위버 CS6
시각적 웹 개발 도구

SublimeText3 Mac 버전
신 수준의 코드 편집 소프트웨어(SublimeText3)

뜨거운 주제











멀티 스레딩의 장점은 특히 많은 양의 데이터를 처리하거나 시간이 많이 걸리는 작업을 수행하기 위해 성능 및 리소스 활용도를 향상시킬 수 있다는 것입니다. 이를 통해 여러 작업을 동시에 수행하여 효율성을 향상시킬 수 있습니다. 그러나 너무 많은 스레드가 성능 저하로 이어질 수 있으므로 CPU 코어 수와 작업 특성에 따라 스레드 수를 신중하게 선택해야합니다. 또한 다중 스레드 프로그래밍에는 교착 상태 및 레이스 조건과 같은 과제가 포함되며 동기화 메커니즘을 사용하여 해결해야하며 동시 프로그래밍에 대한 확실한 지식, 장단점을 측정하고주의해서 사용해야합니다.

SQL IF 명령문은 구문을 다음과 같이 조건부로 실행하는 데 사용됩니다. if (조건) 그런 다음 {state} else {state} end if;. 조건은 유효한 SQL 표현식 일 수 있으며 조건이 참이면 당시 조항을 실행하십시오. 조건이 false 인 경우 else 절을 실행하십시오. 명세서를 중첩 할 수있는 경우 더 복잡한 조건부 점검이 가능합니다.

Root로 MySQL에 로그인 할 수없는 주된 이유는 권한 문제, 구성 파일 오류, 암호 일관성이 없음, 소켓 파일 문제 또는 방화벽 차단입니다. 솔루션에는 다음이 포함됩니다. 구성 파일의 BAND-ADDRESS 매개 변수가 올바르게 구성되어 있는지 확인하십시오. 루트 사용자 권한이 수정 또는 삭제되어 재설정되었는지 확인하십시오. 케이스 및 특수 문자를 포함하여 비밀번호가 정확한지 확인하십시오. 소켓 파일 권한 설정 및 경로를 확인하십시오. 방화벽이 MySQL 서버에 연결되는지 확인하십시오.

Vue Axios의 크로스 도메인 문제를 해결하는 방법 : Cors 플러그인을 사용하여 Websocket을 사용하여 JSONP를 사용하여 Axios 프록시를 사용하여 서버 측의 CORS 헤더 구성

이 기사는 데비안 시스템에서 Apache Logs를 분석하여 웹 사이트 성능을 향상시키는 방법을 설명합니다. 1. 로그 분석 기본 사항 Apache Log는 IP 주소, 타임 스탬프, 요청 URL, HTTP 메소드 및 응답 코드를 포함한 모든 HTTP 요청의 자세한 정보를 기록합니다. 데비안 시스템 에서이 로그는 일반적으로 /var/log/apache2/access.log 및 /var/log/apache2/error.log 디렉토리에 있습니다. 로그 구조를 이해하는 것은 효과적인 분석의 첫 번째 단계입니다. 2. 로그 분석 도구 다양한 도구를 사용하여 Apache 로그를 분석 할 수 있습니다.

Apache에서 Zend를 구성하는 방법은 무엇입니까? Apache 웹 서버에서 Zend 프레임 워크를 구성하는 단계는 다음과 같습니다. Zend 프레임 워크를 설치하고 웹 서버 디렉토리로 추출하십시오. .htaccess 파일을 만듭니다. Zend 응용 프로그램 디렉토리를 작성하고 Index.php 파일을 추가하십시오. Zend 응용 프로그램 (application.ini)을 구성하십시오. Apache 웹 서버를 다시 시작하십시오.

Apache Server는 브라우저와 웹 사이트 서버 간의 브리지 역할을하는 강력한 웹 서버 소프트웨어입니다. 1. HTTP 요청을 처리하고 요청에 따라 웹 페이지 컨텐츠를 반환합니다. 2. 모듈 식 디자인은 SSL 암호화 지원 및 동적 웹 페이지와 같은 확장 된 기능을 허용합니다. 3. 보안 취약점을 피하고 고성능 웹 애플리케이션을 구축하기 위해 보안 취약점을 피하고 스레드 카운트 및 타임 아웃 시간과 같은 성능 매개 변수를 최적화하기 위해 구성 파일 (예 : 가상 호스트 구성)을 신중하게 설정해야합니다.

질문 : MySQL이 MacOS에서 실행할 수 있습니까? 답 : 예. 특정 지침 : 공식 MySQL 설치 프로그램을 통해 설치할 수 있습니다. Homebrew를 사용하여 설치하여 명령 줄 기반 설치 방법 및 종속성 관리를 제공 할 수 있습니다. MySQL 명령 줄 클라이언트를 사용하여 데이터베이스 및 테이블을 만듭니다. 쿼리 성능을 최적화하고 인덱싱, 쿼리 캐시 및 데이터베이스 표준화를 이해합니다. 충돌하는 버전 문제를 피하고 단일 설치 방법을 사용하십시오. 안전한 구성을 보장하고 강력한 암호 및 액세스 제어를 사용하십시오.
