1

我已将 Microsoft 的 SQL Server 文件添加到我的项目中,并且正在运行SqlCommand将我的数据插入文件中。我是using System.Data.SqlClient;。以下代码是我如何将数据添加到我的文件中。在我的程序完成运行后,我转到项目中的数据资源管理器并要求显示表数据,HistQuote但没有任何显示。任何人都可以就我如何验证我的INSERT陈述是否有效提供建议。

using (SqlConnection connection = new SqlConnection(Settings.Default.StorageConnectionString))
{
    connection.Open();
    for (int intCurrentQuote = 0; intCurrentQuote < this.clbStockSelect.CheckedItems.Count; ++intCurrentQuote)
    {
        for (int intCurrentDate = 0; intCurrentDate < Quotes[intCurrentQuote].HistStockDate.Count; ++intCurrentDate)
        {
            string strInsert = "INSERT INTO [HistQuote] ";
            string strColumns = "(Symbol, [Date], [Open], High, Low, Volume, Adj_Close, [Close]) ";
            string strValues = "VALUES (@Symbol, @Date, @Open, @High, @Low, @Volume, @Adj_Close, @Close)";

            using (SqlCommand sqlCommand = new SqlCommand(strInsert + strColumns + strValues, connection))
            {
            sqlCommand.Parameters.Clear();
            sqlCommand.Parameters.Add(new SqlParameter("@Symbol", SqlDbType.NChar));
            sqlCommand.Parameters.Add(new SqlParameter("@Date", SqlDbType.DateTime));
            sqlCommand.Parameters.Add(new SqlParameter("@Open", SqlDbType.Real));
            sqlCommand.Parameters.Add(new SqlParameter("@High", SqlDbType.Real));
            sqlCommand.Parameters.Add(new SqlParameter("@Low", SqlDbType.Real));
            sqlCommand.Parameters.Add(new SqlParameter("@Close", SqlDbType.Real));
            sqlCommand.Parameters.Add(new SqlParameter("@Volume", SqlDbType.Real));
            sqlCommand.Parameters.Add(new SqlParameter("@Adj_Close", SqlDbType.Real));
            sqlCommand.Parameters["@Symbol"].Size = 10;

            sqlCommand.Prepare();

            sqlCommand.Parameters["@Symbol"].Value = this.Quotes[intCurrentQuote].HistSymbol;
            sqlCommand.Parameters["@Date"].Value = this.Quotes[intCurrentQuote].HistStockDate[intCurrentDate];
            sqlCommand.Parameters["@Open"].Value = this.Quotes[intCurrentQuote].HistOpen[intCurrentDate];
            sqlCommand.Parameters["@High"].Value = this.Quotes[intCurrentQuote].HistHigh[intCurrentDate];
            sqlCommand.Parameters["@Low"].Value = this.Quotes[intCurrentQuote].HistLow[intCurrentDate];
            sqlCommand.Parameters["@Close"].Value = this.Quotes[intCurrentQuote].HistClose[intCurrentDate];
            sqlCommand.Parameters["@Volume"].Value = this.Quotes[intCurrentQuote].HistVolume[intCurrentDate];
            sqlCommand.Parameters["@Adj_Close"].Value = this.Quotes[intCurrentQuote].HistAdjClose[intCurrentDate];
            sqlCommand.ExecuteNonQuery();
            sqlCommand.Parameters.Clear();
            }
        }
    }
    connection.Close();
}
4

2 回答 2

1

整个User Instance 和 AttachDbFileName=方法是有缺陷的 - 充其量!在 Visual Studio 中运行您的应用程序时,它将围绕.mdf文件进行复制(从您的App_Data目录到输出目录 - 通常.\bin\debug是您的应用程序运行的位置),并且很可能,您的INSERT工作正常 - 但您只是看错了 . mdf文件到底!

如果您想坚持使用这种方法,请尝试在myConnection.Close()调用上设置断点 - 然后.mdf使用 SQL Server Mgmt Studio Express 检查文件 - 我几乎可以肯定您的数据在那里。

我认为真正的解决方案是

  1. 安装 SQL Server Express(反正你已经完成了)

  2. 安装 SQL Server Management Studio Express

  3. 在SSMS Express中创建您的数据库,给它一个逻辑名称(例如Storage

  4. 使用它的逻辑数据库名称(在服务器上创建它时给出)连接到它——不要乱用物理数据库文件和用户实例。在这种情况下,您的连接字符串将类似于:

    Data Source=.\\SQLEXPRESS;Database=Storage;Integrated Security=True
    

    其他一切都和以前完全一样......

另请参阅 Aaron Bertrand 的优秀博文 踢坏习惯:使用 AttachDbFileName了解更多背景信息。

于 2015-04-04T16:51:38.430 回答
0

这样的事情可能会奏效吗?

using System;
using System.Collections.Generic;
using System.Data.SqlClient;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Dataread
{
    class Program
{
    static void Main(string[] args)
    {
        using (SqlConnection connection = new SqlConnection(Settings.Default.StorageConnectionString))
        {
            connection.Open();
            string strCmd = "Select * from [HistQuote]";

            using (SqlCommand sqlCommand = new SqlCommand(strCmd, connection))
            {
                var rdr = new SqlDataReader();
                rdr = sqlCommand.ExecuteReader();
                while(rdr.Read())
                {
                    Console.WriteLine(rdr["Symbol"].ToString() + rdr["Date"].ToString() + rdr["Open"].ToString() + rdr["High"].ToString() + rdr["Low"].ToString() + rdr["Volume"].ToString() + rdr["Adj_Close"].ToString() + rdr["Close"].ToString());
                }
            }
            connection.Close();
        }
    }
}
}
于 2015-04-04T15:46:25.893 回答