Problem med Sqlce(SQL compact edition) i C#

Permalänk

Problem med Sqlce(SQL compact edition) i C#

Försöker lära mig använda sql i C#. Tänkte eftersom jag bara ska använda databasen för att exprimentera så borde det räcka med sqlce som följer med C#. Dock har jag fått problem när jag ska försöka läsa ut en tabell från databasen. Har inga problem att lägga in data i databasen. Ser att datan finns i databasen.

När jag ska göra reader.Read() så verkar inte c# kunna hantera det ser meddelande i reader:

- HasRows '(reader).HasRows' threw an exception of type 'System.InvalidOperationException' bool {System.InvalidOperationException}
+ base {"SQL Server Compact does not support calls to HasRows property if the underlying cursor is not scrollable." System.SystemException {System.InvalidOperationException}

Försökte med:

cmd.ExecuteResultSet(ResultSetOptions.Scrollable); ]

men verkar inte som det hjälpte. Någon som kan se något uppenbart fel? Eller någon annan lösning som jag skulle kunna använda mig av med sqlce?

class Database { // Retrieve the connection string from the settings file. string conString = Properties.Settings.Default.MyDatabaseConnectionString; SqlCeConnection conn; private Random random = new Random(); private QuestionCard[] dictionary; private QuestionCard currentQuestion { get; set; } public Database() { // Open the connection using the connection string. using ( conn = new SqlCeConnection( conString ) ) { try { conn.Open(); } catch (Exception ex) { MessageBox.Show("Error has occured: " + ex.Message, "ERROR"); } try { int i = 0; string select = "SELECT word1, word2, Comment, CorrectAnswers FROM dictionary"; SqlCeCommand cmd = new SqlCeCommand(select, conn); cmd.ExecuteResultSet(ResultSetOptions.Scrollable); SqlCeDataReader reader = cmd.ExecuteReader(); while( reader.Read()) { dictionary[i] = new QuestionCard( reader[0].ToString(), reader[1].ToString(), reader[2].ToString(), 0 ); i++; } } catch (Exception ex) { MessageBox.Show("Error has occured: " + ex.Message, "ERROR"); } } } }

Permalänk
Medlem
Skrivet av GainerPRO:

Försöker lära mig använda sql i C#. Tänkte eftersom jag bara ska använda databasen för att exprimentera så borde det räcka med sqlce som följer med C#. Dock har jag fått problem när jag ska försöka läsa ut en tabell från databasen. Har inga problem att lägga in data i databasen. Ser att datan finns i databasen.

När jag ska göra reader.Read() så verkar inte c# kunna hantera det ser meddelande i reader:

- HasRows '(reader).HasRows' threw an exception of type 'System.InvalidOperationException' bool {System.InvalidOperationException}
+ base {"SQL Server Compact does not support calls to HasRows property if the underlying cursor is not scrollable." System.SystemException {System.InvalidOperationException}

Försökte med:

cmd.ExecuteResultSet(ResultSetOptions.Scrollable); ]

men verkar inte som det hjälpte. Någon som kan se något uppenbart fel? Eller någon annan lösning som jag skulle kunna använda mig av med sqlce?

class Database { // Retrieve the connection string from the settings file. string conString = Properties.Settings.Default.MyDatabaseConnectionString; SqlCeConnection conn; private Random random = new Random(); private QuestionCard[] dictionary; private QuestionCard currentQuestion { get; set; } public Database() { // Open the connection using the connection string. using ( conn = new SqlCeConnection( conString ) ) { try { conn.Open(); } catch (Exception ex) { MessageBox.Show("Error has occured: " + ex.Message, "ERROR"); } try { int i = 0; string select = "SELECT word1, word2, Comment, CorrectAnswers FROM dictionary"; SqlCeCommand cmd = new SqlCeCommand(select, conn); cmd.ExecuteResultSet(ResultSetOptions.Scrollable); SqlCeDataReader reader = cmd.ExecuteReader(); while( reader.Read()) { dictionary[i] = new QuestionCard( reader[0].ToString(), reader[1].ToString(), reader[2].ToString(), 0 ); i++; } } catch (Exception ex) { MessageBox.Show("Error has occured: " + ex.Message, "ERROR"); } } } }

nu har jag i ärlighetens namn inte använt mig av SqlCe-grejjerna, men om du bara ska läsa, så behöver du ju egentligen inte kontrollera om readern har några rader. har den inga, så returnerar Read() false direkt.

i vanliga fall hade jag gjort något liknande, vet inte om det funkar i SqlCe:

string connectionString = ConfigurationManager.ConnectionStrings["MyConnectionString"].ConnectionString; string sql = "SELECT * FROM SomeTable"; using (var connection = new SqlCeConnection(connectionString)) using (var command = new SqlCeCommand(sql, connection)) { if (command.Connection.State != ConnectionState.Open) command.Connection.Open(); using (var reader = command.ExecuteReader(CommandBehaviour.CloseConnection)) { while (reader.Read()) { // hämta data. (reader.GetString(0) exempelvis) } reader.Close(); } if (command.Connection.State != ConnectionState.Closed) command.Connection.Close(); }

såg iofs att du har ExecuteResultSet i din kod och den verkar returnera ett SqlCeResultSet som liknar readern. har som sagt aldrig använt mig av SqlCe, men det var vad jag snappade upp när jag läste dokumentationen iaf.

som en parentes kan nämnas att din första try/catch inte gör någon direkt nytta, eftersom det enda som händer är att du visar en messagebox. när den väl är klar med det, så försöker den fortsätta köra som om inget hade hänt, vilket i sin tur leder till en massa fel när den stängda databasanslutningen används.

Visa signatur

as far as we can tell, the massacre went well...

Permalänk

Tack för hjälpen dock får jag fortfarande samma felmedelande

Missade att skriva att raden: "MessageBox.Show("Error has occured: " + ex.Message, "ERROR");"
skriver ut:
{"Object reference not set to an instance of an object."} System.Exception {System.NullReferenceException}

Några andra förslag på vad som kan vara fel? Har försökt följa guiden på hxxp://vvv.dotnetperls.com/sqlce

Har ändrat koden till det här:

class Database { // Retrieve the connection string from the settings file. string conString = Properties.Settings.Default.MyDatabaseConnectionString; SqlCeConnection conn; private Random random = new Random(); private QuestionCard[] dictionary; private QuestionCard currentQuestion { get; set; } // string connectionString = ConfigurationManager.ConnectionStrings["MyConnectionString"].ConnectionString; string sql = "SELECT word1, word2, Comment, CorrectAnswers FROM dictionary"; public Database() { try { using (var connection = new SqlCeConnection(conString)) using (var command = new SqlCeCommand(sql, connection)) { if (command.Connection.State != ConnectionState.Open) command.Connection.Open(); int i = 0; using (var reader = command.ExecuteReader(CommandBehavior.CloseConnection)) { while (reader.Read()) { // hämta data. (reader.GetString(0) exempelvis) // (string tag, string eng, string comment, int correct_answers) dictionary[i] = new QuestionCard(reader[0].ToString(), reader[1].ToString(), reader[2].ToString(), 0); i++; } reader.Close(); } if (command.Connection.State != ConnectionState.Closed) command.Connection.Close(); } } catch (Exception ex) { MessageBox.Show("Error has occured: " + ex.Message, "ERROR"); } }

Permalänk
Medlem

det borde vara variablen dictionary som är null. du måste skapa arrayen innan du kan lägga in värden i den.

private QuestionCard[] dictionary = new QuestionCard[100];

vet man inte på förhand hur många platser man behöver i sin array, så kan det kanske vara lättare att använda List<T> istället.

// private QuestionCard[] dictionary; private IList<QuestionCard> dictionary = new List<QuestionCard>(); // dictionary[i] = new QuestionCard(reader[0].ToString(), reader[1].ToString(), reader[2].ToString(), 0); dictionary.Add(new QuestionCard(reader.GetString(0), reader.GetString(1), reader.GetString(2), 0);

Visa signatur

as far as we can tell, the massacre went well...

Permalänk

Tack, hade använt mig av en fil innan som databas där jag hade den kollen. Missade det sen.

Så var helt hundra på att det bara vara SQL delen som inte funka så har stirrat mig blint på det bra länge nu.

Så tusen tack förhjälpen.