#c# #sql #sql-server-ce
Вопрос:
Я хочу проверить , соответствует ли тип данных столбца SQL Server Compact Int
, и если да, измените его на Float
.
Однако я только что получил это сообщение, что тип-строка, тогда как тип столбца Номер 7 «Сумма» — INT.
На данный момент я не указал SQL-запрос для перехода с INT на Float, я добавлю, как только условие будет выполнено, и он получит правильный тип данных столбца «Сумма», который сейчас является INT.
private void CheckDataType()
{
MessageBox.Show("Checking Data Type");
string sqlcon = @"Data Source = .Records.sdf;Persist Security Info=False";
using (SqlCeConnection conn = new SqlCeConnection(sqlcon))
{
conn.Open();
SqlCeCommand cmd = new SqlCeCommand(@"Select data_type
from information_schema.columns
where table_name = 'OutgoingChequeRecords' and column_name = 'Amount'", conn);
SqlCeDataReader reader = cmd.ExecuteReader();
while (reader.Read())
{
MessageBox.Show("Reading Started");
for (int i = 0; i < reader.FieldCount; i )
{
Type dataType = reader.GetFieldType(i);
string columnName = reader.GetName(i);
if (dataType == typeof(int))
{
// Do for integers (INT, SMALLINT, BIGINT)
MessageBox.Show("Type is INT");
}
else if (dataType == typeof(double))
{
// Do for doubles (DOUBLE, DECIMAL)
MessageBox.Show("Type is Decimal");
}
else if (dataType == typeof(string))
{
// Do for Strings (VARCHAR, NVARCHAR).
MessageBox.Show("Type is String");
}
else if (dataType == typeof(DateTime))
{
// Do for DateTime (DATETIME)
MessageBox.Show("Type is DateTime");
}
else if (dataType == typeof(byte[]))
{
// Do for Binary (BINARY, VARBINARY, NVARBINARY, IMAGE)
MessageBox.Show(columnName);
}
else if (dataType == typeof(float))
{
MessageBox.Show("Type is Float");
}
}
}
MessageBox.Show("Reading Stopped, Connection Closed");
conn.Close();
}
}
Комментарии:
1. Пожалуйста, поделитесь заявлением о СОЗДАНИИ ТАБЛИЦЫ
2. используйте корпус выключателя!
3. Таблица @ErikEJ уже существует, я проверяю случаи.
4. Фактическим типом данных
data_type
ininformation_schema.columns
всегда будет строка имени типа данных для этого столбца. Так что вы можете просто вывести эту строку. Вы действительно должны использоватьsys.columns
вместо этого, потомуinformation_schema.columns
что это только для совместимости
Ответ №1:
вы можете просто запустить (string)cmd.ExecuteScalar();
и проверить его значение "int"
. Я предполагаю, что во всех схемах есть только один столбец с одинаковым именем таблицы. Если их больше, то вы также можете добавить схему в состояние TABLE_SCHEMA = 'yourSchema'
Комментарии:
1. У меня есть 08 столбцов и его SQL Compact, соответствующий столбец — «Сумма», который является int, поэтому мне нужно изменить его на плавающий, если его int.
2. Я думаю, что ваше решение работает, я тестирую.
3. @NewDeveloper Я думаю, что мой ответ ответил на ваш первоначальный вопрос, не так ли? Изменение типа-это другой вопрос. Вы можете задать новый вопрос
4. Ваше решение работает: однако есть одна проблема, я получаю строку кода типа, как я могу преобразовать эту строку обратно в код типа, чтобы я мог использовать свои случаи переключения выше?
5. Я поддержал ваш ответ. Ваш ответ работает со строкой, но он не определяет тип данных, моя работа все еще завершена.
Ответ №2:
Не могли бы вы, пожалуйста, проверить это таким образом
Type type = reader.GetFieldType(i);
switch (Type.GetTypeCode(type))
{
case TypeCode.DateTime:
break;
case TypeCode.String:
break;
default: break;
}
Комментарии:
1. он обрывается на ниточке. Мой тип столбца «Сумма» — Int.
2. вы провели перекрестную проверку в базе данных, если возможно, можете ли вы напечатать имя столбца и ввести его, чтобы получить полную ясную картину?