tinyint dans SQL Server à octet en C #

Dans la gestion de bases de données et le développement d'applications, nous devons être conscients des besoins en espace et en memory. J'ai toujours appris à utiliser le type de données qui utilise le less d'espace pour vos besoins.

Dans mon scénario, j'ai une colonne dans une table qui stocke les valeurs {0,1,2,3,4} (SQL Server 2012). Pour cela j'ai choisi d'utiliser le type de données tinyint. Ces valeurs sont extraites de la database dans une application C #. Actuellement, je ne peux pas convertir ce type de données tinyint en octet. Lorsque j'essaie, j'obtiens une erreur "Impossible de convertir int en octet". Si je change le type de données dans l'application à un entier, je peux le tirer très bien. Pareil avec une string.

À des fins de performance, est-il correct d'utiliser des entiers dans toute mon application où j'utiliserais normalement un octet? Si non, comment convertir un entier en octet?

C'est le code que j'utilise qui donne une erreur:

ssortingng strSQL = "SELECT securityLevel FROM security WHERE employeeID=@empID;"; using (SqlConnection dbConn = new SqlConnection(connParam)) { dbConn.Open(); byte level = 0; using (SqlCommand dbCommand = new SqlCommand(strSQL, dbConn)) { dbCommand.CommandType = System.Data.CommandType.Text; dbCommand.Parameters.AddWithValue("@empID", "12345"); using (SqlDataReader dbReader = dbCommand.ExecuteReader()) { while (dbReader.Read()) { level = dbReader.GetByte(0); } } } Console.WriteLine(level); Console.ReadLine(); } 

J'ai aussi essayé:

 level = (byte)dbReader.GetValue(0); 

Oui, vous avez eu raison de choisir TINYINT comme type de données si vous TINYINT seulement 0 – 4.

Oui, TINYINT équivaut à un byte dans .Net. Vous pouvez voir une list de mappings ici: http://msdn.microsoft.com/en-us/library/cc716729(v=vs.110).aspx

Non, vous n'avez pas utilisé TINYINT lors de la création de la table, sinon vous n'obtiendrez pas cette erreur. Le message d'erreur est très spécifique sur le type de données source étant INT .

Non, n'utilisez pas INT pour stocker ces valeurs. C'est inutile et ce que vous essayez de faire (c'est-à-dire TINYINT et byte ) est parfaitement valide et je l'ai fait plusieurs fois.

En supposant que vous ne disposez pas de millions de lignes de données dans cette table et que vous ayez des hits constants, exécutez la command suivante:

 ALTER TABLE [security] ALTER COLUMN [securityLevel] TINYINT NOT NULL; 

(Je suppose que la colonne est actuellement NOT NULL et dans ce cas, si vous laissez l'instruction NOT NULL dans l'instruction ALTER TABLE , elle changera le champ en TINYINT NULL . Si le champ n'est pas NOT NULL , alors quitter cette partie)

J'ai écrit le LinqPad suivant (contre SqlServer express) pour vérifier que vous pouvez lire dans un tinyint comme un octet en utilisant .NET et SqlServer:

 var cb = new SqlConnectionSsortingngBuilder { DataSource = @".\Sqlexpress", InitialCatalog = "Medallion_OData_Tests_CustomersContext251990930203", IntegratedSecurity = true }; using (var c = new SqlConnection(cb.ConnectionSsortingng)) { c.Open(); var cmd = c.CreateCommand(); cmd.CommandText = "SELECT CAST(1 AS tinyint)"; var reader = cmd.ExecuteReader(); reader.Read(); reader.GetByte(0).Dump(); } 

Cela me suggère que la colonne securityLevel réelle dans votre database n'est pas du type TINYINT. Pour vérifier, pourquoi ne pas modifier temporairement votre requête select pour inclure un CAST à TINYINT comme dans mon exemple? Si cela fonctionne, cela confirmera que le schéma de la table est le problème.

Les autres moyens de vérifier le schéma de la table sont d'interroger sys.columns ou de mettre en surbrillance le nom de la table dans SqlServer Management Studio et de cliquer sur ALT + F1.

Je pense que le moyen le plus sûr est d'utiliser la méthode Convert.ToByte :

 level = Convert.ToByte(dbReader.GetValue(0)); 

Il convertit de nombreux types de valeur en octets.