【问题标题】:Connection string for SQL Server Compact - windows home serverSQL Server Compact - windows home server 的连接字符串
【发布时间】:2013-06-10 23:18:20
【问题描述】:

我正在使用 SQL Server Compact 4.0 并将站点托管在 Windows Home Server 2011 上,程序是用 C# - Visual Web Developer 编写的。

我已经尝试了我能想到的所有可能的连接字符串变体,但我不断收到此错误:

初始化字符串的格式不符合从索引 0 开始的规范。

这是我目前拥有的字符串

<add name="Inventory" 
     connectionString="Data Source=C:\Program Files\Windows Server\Bin\WebApps\Site\App_Data\PHSInventory.sdf;"  /  >

我也尝试用|data directory| 指向它。我已经用完了谷歌上的蓝色链接来点击。

堆栈跟踪

[ArgumentException: 初始化字符串的格式不符合从索引 0 开始的规范。] System.Data.SqlServerCe.ConStringUtil.GetKeyValuePair(Char[] connectionString, Int32 currentPosition, String& key, Char[] valuebuf, Int32& vallength, Boolean& isempty) +1182 System.Data.SqlServerCe.ConStringUtil.ParseStringIntoHashtable(字符串 conString,哈希表值)+188 System.Data.SqlServerCe.ConStringUtil.ParseConnectionString(字符串和连接字符串)+128 System.Data.SqlServerCe.SqlCeConnection.set_ConnectionString(字符串值)+679 System.Data.SqlServerCe.SqlCeConnection..ctor(字符串连接字符串)+46 System.Data.SqlServerCe.SqlCeDataAdapter..ctor(字符串选择命令文本,字符串选择连接字符串)+73 DataAccess.FillDataTable(String SQL) +149 Default.Page_Load(Object sender, EventArgs e) +378 System.Web.Util.CalliEventHandlerDelegateProxy.Callback(对象发送者,EventArgs e)+51 System.Web.UI.Control.OnLoad(EventArgs e) +92 System.Web.UI.Control.LoadRecursive() +54 System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +772

数据访问

using System;

using System.Data;

using System.Data.SqlClient;

using System.Web.Configuration;

using System.Data.SqlServerCe;

public class DataAccess
{

    private int count = -1;

    public int Count
    { get { return count; } }

    private string connectionString;
    public string ConnectionName
    {
        set
        {
            if (WebConfigurationManager.ConnectionStrings[value] == null)
            {
                throw new Exception("Cannot find connection string named '" +
                   value + "' in web.config");
            }
            //Retrieve connection string from web.config.
            connectionString =
               WebConfigurationManager.ConnectionStrings[value].ConnectionString;
        }
    }

    public DataAccess(string connectionName)
    {
        ConnectionName = connectionName;
    }

    public DataTable FillDataTable(string SQL)
    {
        // Fill dataTable.
         WriteToTraceLogForDebugging(SQL);
        SqlCeConnection sqlConn = new SqlCeConnection("Data Source=D:\\InventoryData\\PHSInventory.sdf;");
        SqlCeDataAdapter objAdapter = new SqlCeDataAdapter(SQL, sqlConn);
        DataTable dt = new DataTable();
        objAdapter.Fill(dt);
        count = dt.Rows.Count;  
        return dt;
    }
    public int ExecuteNonQuery(string SQL)
    {
        WriteToTraceLogForDebugging(SQL);
        SqlCeConnection sqlConn = new SqlCeConnection(connectionString);
        sqlConn.Open();
        SqlCeCommand objCmd = new SqlCeCommand(SQL, sqlConn);
        count = objCmd.ExecuteNonQuery();
        return count;
    }

    public object ExecuteScalar(String SQL)
    {
        WriteToTraceLogForDebugging(SQL);
        SqlCeConnection sqlConn = new SqlCeConnection(connectionString);
        sqlConn.Open();
        SqlCeCommand objCmd = new SqlCeCommand(SQL, sqlConn);
        //calling code needs to cast data (to integer, string, double, etc.) upon receipt. 
        return objCmd.ExecuteScalar();
    }

    private void WriteToTraceLogForDebugging(string sql)
    {
        System.Web.HttpContext.Current.Trace.Write("sql****", sql);
        System.Web.HttpContext.Current.Trace.Write("CONNECTION*****", connectionString);
    }

}

【问题讨论】:

  • 你的连接字符串不应该被引号包围吗?我猜你必须转义内部引号。
  • 您的应用程序使用的是什么版本的 Visual Studio / C# / .NET?您能否在 Visual Studio 的服务器资源管理器窗口中加载数据库并从其表中查询数据?
  • 试试&lt;add name="Inventory" connectionString="Data Source=&amp;quot;C:\Program Files\Windows Server\Bin\WebApps\Site\App_Data\PHSInventory.sdf;&amp;quot;" /&gt;
  • 试过了,同样的错误!

标签: c# sql sql-server-ce connection-string


【解决方案1】:

您正在使用 System.Data.SqlConnection 类,对于 SQL Server Compact,您必须使用 System.Data.SqlServerCe 类,例如 SqlCeConnection。

然后你在构造 SqlCeDataAdapter 错误,你应该使用:

 SqlCeDataAdapter objAdapter = new SqlCeDataAdapter(SQL, sqlConn);

 SqlCeDataAdapter objAdapter = new SqlCeDataAdapter(SQL, connectionString);

【讨论】:

  • 我以为我是,我将我的 DataAccess.cs 添加到原始帖子中。你还能提供什么吗?
  • 谢谢!我切换了 - OP 中的新堆栈跟踪。
  • 谢谢!所以现在它在尝试填充数据表时卡住了。 objAdapter.Fill(dt);我确实尝试了它,我正在等待异常是什么的电子邮件。
  • 访问被拒绝,是我的猜测
  • 我得到了“空引用”,我的数据库需要升级到 sqlce 4.0,所以我现在正试图解决这个问题。
【解决方案2】:

您的引号已关闭:

Data Source="C:\Program Files\Windows Server\Bin\WebApps\Site\App_Data\PHSInventory.sdf;"

应该是:

"Data Source=C:\Program Files\Windows Server\Bin\WebApps\Site\App_Data\PHSInventory.sdf;"

请注意,您的初始字符串会尝试将Data Source 作为文字放置在实际连接字符串之前

connectionString=Data Source="

应该是连接字符串的部分

【讨论】:

  • 抱歉草率,我编辑了我的原始帖子,引号从数据源开始,以 .sdf 结束。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-11
  • 1970-01-01
  • 2013-01-11
  • 1970-01-01
相关资源
最近更新 更多