Как вставить float в таблицу SQL в нужной локали - PullRequest
3 голосов
/ 13 июня 2010

Мне нужно вставить значения с плавающей точкой в ​​разные SQL-серверы.Каждый из них может иметь разные локали, поэтому в одном его представлении может быть «42,2», а в другом «42,2» или что-то еще.Как мне создать запрос, чтобы он работал на любом SQL Server?

Нужно ли определять локаль сервера перед построением запроса или как?

Ответы [ 3 ]

7 голосов
/ 13 июня 2010

Если вы не передаете базовые константы литералов (т. Е. Числа 0 и 1 для столбца, каждый раз), то вы должны использовать параметризованные запросы.

Для этого вам нужно указать вваше заявление SQL, что «здесь я не пишу значение, но я предоставлю значение этого параметра вместе с оператором SQL».

Вот как это сделать в .NET:

using (SqlCommand cmd = conn.CreateCommand())
{
    cmd.CommandText = "INSERT INTO tablename (column) VALUES (@value)";
    cmd.Parameters.Add("@value", 42.2);                         ^
    cmd.ExecuteNonQuery(); ^                                    |
}                          |                                    |
                           +-- these have to match up ----------+

Здесь вы можете видеть, что я вообще не форматирую значение, я предоставляю его как обычное литеральное значение C #.Конечно, я также могу добавить его из переменной, опять же, без необходимости переформатировать его в текст.

Вы должны передавать значения таким образом, или вам приходится иметь дело со всеми видами форматированияпроблем, и если вы принимаете значения от пользователя, вы также можете настроить себя для атаки SQL-инъекцией, что плохо!

1 голос
/ 13 июня 2010

Люди ответили на вставку, но не на язык.

SQL имеет встроенную поддержку локали, как и следовало ожидать. Если вы дадите ему тип, скажем, дату, он будет хранить эту дату в любой локали / сопоставлении, которые вы настроите в SQL. Использование этого из SQL в .NET происходит автоматически - вам не нужно явно конвертировать дату SQL в США в дату GB .NET.

Обратите внимание, что этот интеллект теряется, если вы отправляете SQL значение, закодированное в строку, вы несете ответственность за это, так как все, что видит SQL - это строка, а не дата или число.

Вставка или извлечение локализованных значений из SQL будет происходить неявно, где это возможно, поэтому использование параметризованного запроса (с параметром поддерживаемого типа) будет хорошо.

Я видел ситуацию, когда даты сохранялись в базе данных в виде строк. Это вызвало хаос, потому что три клиента - это ГБ, США и БР - никакой неявной поддержки локали из .NET или SQL, они просто пытаются использовать ее и терпят неудачу на некоторых.

1 голос
/ 13 июня 2010

Используйте готовые заявления.Пример (в java):

long id=1234;
BigDecimal value = new BigDecimal("42.2");// parse it, or get it form a text field

PreparedStatement pstmt = connection.prepareStatement(
    "UPDATE test_table SET decimal_field=? WHERE id=?");
pstmt.setBigDecimal(1, value);
pstmt.setLong(2, id);
pstmt.executeUpdate();

С подготовленными операторами вам не нужно беспокоиться о экранировании строк с помощью '' или sql инъекций .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...