// 根据数据库模板的定义,创建一个数据库 int CreateDatabase(RmsChannel channel, string strTemplateDir, string strDatabaseName, out string strError) { strError = ""; int nRet = 0; List<string[]> logicNames = new List<string[]>(); string[] cols = new string[2]; cols[1] = "zh"; cols[0] = strDatabaseName; logicNames.Add(cols); string strKeysDefFileName = PathUtil.MergePath(strTemplateDir, "keys"); string strBrowseDefFileName = PathUtil.MergePath(strTemplateDir, "browse"); nRet = ConvertGb2312TextfileToUtf8(strKeysDefFileName, out strError); if (nRet == -1) return -1; nRet = ConvertGb2312TextfileToUtf8(strBrowseDefFileName, out strError); if (nRet == -1) return -1; string strKeysDef = ""; string strBrowseDef = ""; StreamReader sr = null; try { sr = new StreamReader(strKeysDefFileName, Encoding.UTF8); strKeysDef = sr.ReadToEnd(); sr.Close(); } catch (Exception ex) { strError = "装载文件 " + strKeysDefFileName + " 时发生错误: " + ex.Message; return -1; } try { sr = new StreamReader(strBrowseDefFileName, Encoding.UTF8); strBrowseDef = sr.ReadToEnd(); sr.Close(); } catch (Exception ex) { strError = "装载文件 " + strBrowseDefFileName + " 时发生错误: " + ex.Message; return -1; } long lRet = channel.DoCreateDB(logicNames, "", // strType, "", // strSqlDbName, strKeysDef, strBrowseDef, out strError); if (lRet == -1) { strError = "创建数据库 " + strDatabaseName + " 时发生错误: " + strError; return -1; } lRet = channel.DoInitialDB(strDatabaseName, out strError); if (lRet == -1) { strError = "初始化数据库 " + strDatabaseName + " 时发生错误: " + strError; return -1; } // 增补其他数据从属对象 /* List<string> subdirs = new List<string>(); // 创建所有目录对象 GetSubdirs(strTemplateDir, ref subdirs); for (int i = 0; i < subdirs.Count; i++) { string strDiskPath = subdirs[i]; // 反过来推算为逻辑路径 // 或者预先在获得的数组中就存放为部分(逻辑)路径? string strPath = ""; // 在服务器端创建对象 // parameters: // strStyle 风格。当创建目录的时候,为"createdir",否则为空 // return: // -1 错误 // 1 以及存在同名对象 // 0 正常返回 nRet = NewServerSideObject( channel, strPath, "createdir", null, null, out strError); if (nRet == -1) return -1; } // 列出每个目录中的文件,并在服务器端创建之 // 注意模板目录下的文件,被当作cfgs中的文件来创建 * */ DirectoryInfo di = new DirectoryInfo(strTemplateDir); FileInfo[] fis = di.GetFiles(); // 创建所有文件对象 for (int i = 0; i < fis.Length; i++) { string strName = fis[i].Name; if (strName == "." || strName == "..") continue; if (strName.ToLower() == "keys" || strName.ToLower() == "browse") continue; string strFullPath = fis[i].FullName; nRet = ConvertGb2312TextfileToUtf8(strFullPath, out strError); if (nRet == -1) return -1; Stream s = new FileStream(strFullPath, FileMode.Open); try { string strPath = strDatabaseName + "/cfgs/" + strName; // 在服务器端创建对象 // parameters: // strStyle 风格。当创建目录的时候,为"createdir",否则为空 // return: // -1 错误 // 1 以及存在同名对象 // 0 正常返回 nRet = NewServerSideObject( channel, strPath, "", s, null, out strError); if (nRet == -1) return -1; } finally { s.Close(); } } return 0; }
// 初始化数据库 void menu_initialDB(object sender, System.EventArgs e) { if (this.SelectedNode == null) { MessageBox.Show(this, "尚未选择要初始化的数据库节点"); return; } if (this.SelectedNode.ImageIndex != RESTYPE_DB) { MessageBox.Show(this, "所选择的节点不是数据库类型。请选择要初始化的数据库节点。"); return; } ResPath respath = new ResPath(this.SelectedNode); string strText = "你确实要初始化位于服务器 '"+respath.Url+"' 上的数据库 '"+respath.Path + "' 吗?\r\n\r\n警告:数据库一旦被初始化,其中包含的原有数据将全部被摧毁,并且无法恢复!"; DialogResult msgResult = MessageBox.Show(this, strText, "初始化数据库", MessageBoxButtons.OKCancel, MessageBoxIcon.Question, MessageBoxDefaultButton.Button2); if (msgResult != DialogResult.OK) { MessageBox.Show(this, "初始化数据库操作被放弃..."); return; } this.channel = Channels.GetChannel(respath.Url); Debug.Assert(channel != null, "Channels.GetChannel() 异常"); string strError = ""; #if NO DigitalPlatform.Stop stop = null; if (stopManager != null) { stop = new DigitalPlatform.Stop(); stop.Register(this.stopManager, true); // 和容器关联 stop.OnStop += new StopEventHandler(this.DoStop); stop.Initial("正在初始化数据库: " + respath.FullPath); stop.BeginLoop(); } #endif DigitalPlatform.Stop stop = PrepareStop("正在初始化数据库: " + respath.FullPath); long lRet = channel.DoInitialDB(respath.Path, out strError); EndStop(stop); #if NO if (stopManager != null) { stop.EndLoop(); stop.OnStop -= new StopEventHandler(this.DoStop); stop.Initial(""); stop.Unregister(); // 和容器脱离关联 } #endif this.channel = null; if (lRet == -1) { MessageBox.Show(this, strError); } else { MessageBox.Show(this, "位于服务器'"+respath.Url+"'上的数据库 '"+respath.Path+"' 被成功初始化。"); } }