C#SQL Server Compact连接在第一次调用时成功,但在第二次调用时不成功

时间:2016-12-08 05:17:32

标签: c# sql sql-server-ce

我是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对于让我走到这一步至关重要,我非常感谢大家在这里提供的帮助。

1 个答案:

答案 0 :(得分:0)

我在我的电脑上尝试了你的代码并且它有效。我使用“项目”菜单和“添加新项”并选择“本地数据库”在Visual Studio中创建了SQL Compact Edition数据库。它适用于第一个查询和第二个查询。我注意到你没有关闭连接,但我不认为这是你的问题的原因。在我的电脑上,.sdf文件在项目文件夹中创建,并作为项目的一部分显示在解决方案资源管理器中。如果您的.sdf文件未包含在项目中,则可以尝试先添加它,然后再尝试代码。