J'ai ajouté un file SQL Server de Microsoft à mon projet et SqlCommand
un SqlCommand
pour insert mes données dans le file. J'utilise using System.Data.SqlClient;
. Le code suivant est comment j'ajoute des données à mon file. Une fois mon programme terminé, je vais dans l'explorateur de données de mon projet et request à afficher datatables de HistQuote
d' HistQuote
et rien ne s'affiche. Quelqu'un pourrait-il me conseiller sur la façon dont je peux vérifier que mon instruction INSERT
fonctionne?
using (SqlConnection connection = new SqlConnection(Settings.Default.StorageConnectionSsortingng)) { connection.Open(); for (int intCurrentQuote = 0; intCurrentQuote < this.clbStockSelect.CheckedItems.Count; ++intCurrentQuote) { for (int intCurrentDate = 0; intCurrentDate < Quotes[intCurrentQuote].HistStockDate.Count; ++intCurrentDate) { ssortingng strInsert = "INSERT INTO [HistQuote] "; ssortingng strColumns = "(Symbol, [Date], [Open], High, Low, Volume, Adj_Close, [Close]) "; ssortingng 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(); }
L'approche User Instance et AttachDbFileName = entière est imparfaite – au mieux! Lorsque vous exécutez votre application dans Visual Studio, elle va copyr le file .mdf
(de votre directory App_Data
vers le directory de sortie – généralement .\bin\debug
– où votre application s'exécute) et très probablement , votre INSERT
fonctionne très bien – mais vous regardez juste le mauvais file .mdf à la fin!
Si vous voulez myConnection.Close()
cette approche, essayez de mettre un point d'arrêt sur l'appel myConnection.Close()
– puis inspectez le file .mdf
avec SQL Server Mgmt Studio Express – Je suis presque certain que vos données sont là.
La vraie solution à mon avis serait de
installez SQL Server Express (et vous l'avez déjà fait de toute façon)
installer SQL Server Management Studio Express
créez votre database dans SSMS Express , donnez-lui un nom logique (par exemple Storage
)
connectez-vous en utilisant son nom de database logique (donné lorsque vous le créez sur le server) – et ne vous mêlez pas des files de database physiques et des instances d'users. Dans ce cas, votre string de connection serait quelque chose comme:
Data Source=.\\SQLEXPRESS;Database=Storage;Integrated Security=True
et tout le rest est exactement le même qu'avant …
Voir aussi l'excellent article de Aaron Bertrand Bad mauvaises habitudes: utiliser AttachDbFileName pour plus d'informations.
Est-ce que quelque chose comme ça pourrait fonctionner?
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(ssortingng[] args) { using (SqlConnection connection = new SqlConnection(Settings.Default.StorageConnectionSsortingng)) { connection.Open(); ssortingng 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"].ToSsortingng() + rdr["Date"].ToSsortingng() + rdr["Open"].ToSsortingng() + rdr["High"].ToSsortingng() + rdr["Low"].ToSsortingng() + rdr["Volume"].ToSsortingng() + rdr["Adj_Close"].ToSsortingng() + rdr["Close"].ToSsortingng()); } } connection.Close(); } } } }