我正在为我的工作创建一个应用程序来跟踪学年中的行为管理。为此,我显然需要一个数据库。我构建了程序,以便在打开时检查数据库是否存在,如果不存在,则创建一个,并输入模式。这在我的开发计算机上完美运行,但是当我使用Windows XP将其切换到计算机时,它会出现一个错误,提示system.io.filenotfoundexception。我无法弄清楚为什么它不会创建数据库。 我正在使用Visual C#2010 Express。并且数据库是在sql server ce中创建的。
if (!File.Exists("chart.sdf"))//Checks if file is already in existance when app is opened
{
dbCreated = createDb();//If there is no database, creates one
}
public bool createDb()//Creates the database if needed
{
bool success = true;
//Holds sql schema for the table
string[] tableCreateArr ={"create table childNameId"
+ "(childId INT IDENTITY PRIMARY KEY, "
+ "childFName nchar(40), "
+ "childLName nchar(40));",
"create table leaderNameId"
+ "(leaderId INT IDENTITY PRIMARY KEY, "
+ "leaderFName nchar(40), "
+ "leaderLName nchar(40));",
"create table TagPulledId"
+ "(tagId INT IDENTITY PRIMARY KEY, "
+ "childId INT, "
+ "leaderId INT, "
+ "day TINYINT, "
+ "month TINYINT, "
+ "year INT);",
"CREATE TABLE tagInfo"
+ "(tagId INT, "
+ "color nchar(10), "
+ "description ntext)"};
SqlCeEngine dbCreate = new SqlCeEngine(connectString()); // creates the database obj
dbCreate.CreateDatabase(); // creates the database file
SqlCeConnection tempConnect = new SqlCeConnection(connectString());//Connects to the new database
SqlCeCommand objCmd = new SqlCeCommand();//Creates an sql command obj
tempConnect.Open(); // opens the connection
objCmd.Connection = tempConnect; //Connects the command obj
foreach (string strCmd in tableCreateArr)//Iterates throught he sql schema to create the tables
{
try
{
objCmd.CommandText = strCmd; //sets the CommandText to the next schema entry in the array
objCmd.ExecuteNonQuery(); //Executes the create query
}
catch (SqlCeException sqlError)
{
MessageBox.Show(sqlError.Message, "SQL Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
success = false;
}
}
tempConnect.Close();
return success;
}
我无法弄清楚为什么应用程序没有创建数据库,它似乎在某些计算机上工作,而不是在其他计算机上工作。任何帮助都会很棒!谢谢。
答案 0 :(得分:2)
if(!File.Exists(“chart.sdf”))
您似乎想要在与程序相同的目录中创建数据库。是的,这将适用于你的开发机器,但这不适用于普通机器。典型的安装目录(c:\ program files \ etc)不允许对文件进行写访问。
您需要使用Environment.GetFolderPath()来获取可以写入的ApplicationData目录。
让安装程序创建appdata目录并在其中复制初始.sdf文件通常要容易得多并且不容易出错。尽管Express版本不支持安装项目。有一个问题,黑客代码解决Express版本的限制正在打败产品许可证的价格。你离这儿很近。
答案 1 :(得分:0)
确保已部署所有需要的dql Sql Server Compact。我不确定你在安装.NET框架时会得到它们。需要的dll是:
您可以在此MSDN页面上找到有关各种版本数据库引擎的Sql Compact Deployment的更多详细信息。