我是OOP世界的新手程序员。在我自学的过程中,我正在开发一个基于SQL的小应用程序。由于我计划多次连接到SQL Server Compact数据库,所以我决定把它放在自己的类中。第一次调用类方法时连接成功,但第二次调用相同的类方法时,它会抛出无效的路径类型异常。我可以告诉他在第一次运行时发现它应该是.sdf
,但是在第二次运行时它会查看visual studio的项目文件的调试文件夹,当然这是不正确的。
using System.IO;
using System.Data.SqlServerCe;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Net;
using System.Net.Sockets;
using System.Threading;
namespace Horizon_CRM_Server
{
public class sqlengine
{
public string sqlinst { get; set; }
public string sqlpass { get; set; }
public string sqlquery { get; set; }
public string sqlquerytype { get; set; }
public string[] sqldata { get; set; }
public string[] sqlstringoutput { get; set; }
public Int32 sqlintoutput { get; set; }
public sqlengine() { }
public void runsqlengine()
{
using (SqlCeConnection main_conn = new SqlCeConnection("Data Source=" + this.sqlinst + ";Password=" + this.sqlpass))
{
try
{
Console.WriteLine("SQL ENGINE CALLED");
Console.WriteLine();
SqlCeCommand sqlcommand = new SqlCeCommand(sqlquery, main_conn);
sqlcommand.Connection.Open();
switch (this.sqlquerytype)
{
case "count":
Console.WriteLine("SQLENGINE COUNTING");
Console.WriteLine();
this.sqlintoutput = (Int32)sqlcommand.ExecuteScalar();
Console.WriteLine("Initial Connection to Database Succeeded. There are " + this.sqlintoutput + " Users registered");
break;
default:
Console.WriteLine("ERROR");
break;
}
}
catch (SqlCeException ex)
{
string expath = null;
Console.WriteLine("ERROR:");
Console.WriteLine(ex);
Console.WriteLine();
try
{
string ez = ex.ToString();
expath = AppDomain.CurrentDomain.BaseDirectory + DateTime.Now.ToString("dd_MM_yyyy_hhmmss_fff") + "HorizonCRM_ERR.txt";
System.IO.File.WriteAllText(expath, ez);
Console.WriteLine("ERROR HAS BEEN LOGGED TO: ");
Console.WriteLine(expath);
Console.WriteLine();
}
catch (IOException ex2)
{
Console.WriteLine("ERROR: Could not log exception!");
Console.WriteLine(ex2);
Console.WriteLine();
}
catch (Exception ex3)
{
Console.WriteLine("ERROR: UNKNOWN!");
Console.WriteLine(ex3);
Console.WriteLine();
}
}
}
}
}
class Program
{
static void Main(string[] args)
{
IPHostEntry crmhost = Dns.GetHostEntry("127.0.0.1");
IPAddress crmip = crmhost.AddressList[0];
IPEndPoint localendpoint = new IPEndPoint(crmip, 11000);
sqlengine sqlusers = new sqlengine();
sqlusers.sqlinst = "crmDB.sdf";
sqlusers.sqlpass = "4or1Z0n";
sqlusers.sqlquery = "SELECT COUNT(*) Id FROM user_data";
sqlusers.sqlquerytype = "count";
sqlusers.runsqlengine();
sqlengine sqlcustomers = new sqlengine();
**sqlcustomers.sqlinst = "cmrDB.sdf";**
sqlcustomers.sqlpass = "4or1Z0n";
sqlcustomers.sqlquery = "SELECT COUNT (*) Id FROM customer_data";
sqlcustomers.sqlquerytype = "count";
sqlcustomers.runsqlengine();
Console.ReadLine();
}
}
}
我意识到我可以直接定义连接字符串,但是如果需要,可以保留选项以在启动时将其指向单独的数据库文件。
我是否认为这一切都错了?我是否错误地连接到精简版数据库?
Stack Overflow对于让我走到这一步至关重要,我非常感谢大家在这里提供的帮助。
答案 0 :(得分:0)
我在我的电脑上尝试了你的代码并且它有效。我使用“项目”菜单和“添加新项”并选择“本地数据库”在Visual Studio中创建了SQL Compact Edition数据库。它适用于第一个查询和第二个查询。我注意到你没有关闭连接,但我不认为这是你的问题的原因。在我的电脑上,.sdf文件在项目文件夹中创建,并作为项目的一部分显示在解决方案资源管理器中。如果您的.sdf文件未包含在项目中,则可以尝试先添加它,然后再尝试代码。