C #: преобразовать строку в DBType.AnsiStringFixedLength - PullRequest
1 голос
/ 22 февраля 2010

У меня есть хранимая процедура. Одним из его входных параметров является ожидание char (8). Я пытаюсь преобразовать строку «AAA» в этот конкретный тип параметра, который является DBType.AnsiStringFixedLength.

object v = Convert.ChangeType("AAA", param.DbType.GetTypeCode()); 
// param is AnsiStringFixedLength

Однако все, что я получаю, является исключением: входная строка была в неправильном формате. И трассировка стека говорит: в System.Number.StringToNumber (String str, NumberStyles, NumberBuffer & number, информация NumberFormatInfo, логический parseDecimal) [...]

Почему System.Convert пытается преобразовать строку в число, даже если параметр prodecure ожидает char (8)? Как мне это решить? Я не хочу использовать один огромный случай переключения, отображающий все типы SQL в типы CLR ...

* 1007 EDIT *: Это рассматриваемый код: (универсальный метод для вызова любой хранимой процедуры MS SQL)
using (SqlConnection conn = new SqlConnection(this.config.ConnectionString))
{
    using (SqlCommand cmd = conn.CreateCommand())
    {
        cmd.CommandType = CommandType.StoredProcedure;
        cmd.CommandText = this.config.StoredProcedureName;

        conn.Open();
        SqlCommandBuilder.DeriveParameters(cmd);

        foreach (SqlParameter param in cmd.Parameters)
        {
            if (param.Direction == ParameterDirection.Input ||
                 param.Direction == ParameterDirection.InputOutput)
            {
                try
                {
                    string rawParam = param.ParameterName.Replace("@", "");
                    if (this.config.Parameters.ContainsKey(rawParam))
                    {
                        try
                        {
                            param.Value = Convert.ChangeType(this.config.Parameters[rawParam],
                                param.DbType.GetTypeCode());
                        }
                        catch(Exception oops)
                        {
                            throw new Exception(string.Format("Could not convert to '{0}'.", param.DbType), oops);
                        }
                    }
                    else
                        throw new ArgumentException("parameter's not available");
                }
                catch (Exception e)
                {
                    throw;
                }
            }
        }  
        cmd.ExecuteNonQuery();
    }
}

Фактические значения параметров предоставляются this.config.Parameters - все они являются строками. Я перебираю список параметров SqlCommand и устанавливаю их соответствующим образом. Здесь необходимо преобразовать строковые значения в тип Sql параметра, и, насколько я вижу, тип Sql предоставляется param.DBType.

1 Ответ

2 голосов
/ 22 февраля 2010

Вы, кажется, перепутали некоторые вещи здесь, или я не понимаю, что вы пытаетесь сделать. DbType (перечисление) наследует Enum, и это реализует IConvertible -> Вы можете позвонить GetTypeCode(). Но - вы сейчас звоните Enum.GetTypeCode(), который возвращает базовый тип. Если вы не указали это (а DbType не сделал), то любой Enum будет поддержан int.

Что вы пытаетесь решить с помощью кода в любом случае? Зачем вам хотеть изменить тип строки, если параметром является строка (хотя и с фиксированной длиной)?


Глядя на вопрос еще немного, он кажется еще более странным. У вас есть объект v (вероятно, для значения?) - что вас интересует в типе?

object v1 = "Foo";

object v1 = 42;

Какая для вас разница? Я предполагаю, что вы хотите передать значения чему-то другому, но - если вы ссылаетесь только на значение как object, вам все равно может потребоваться его приведение.

Пожалуйста, обновите ваш вопрос и объясните, что вы действительно хотите сделать, что вы ожидаете получить.


По поводу комментария:

Я использую Convert.ChangeType (object значение, TypeCode typeCode), так что это не действительно превращается в Enum / Int. В хотя бы это то, что я думал ...

См. Выше: DbType.GetTypeCode() не то, что вы хотите. Попробуйте, дайте мне преимущество сомнения: что вы ожидаете получить от DbType.AnsiStringFixedLength.GetTypeCode()? Каков реальный результат, если вы попробуете это?

Теперь к вашему коду: вы пытаетесь установить для свойства SqlParameter.Value «правильный» тип. Две вещи: Согласно документации, вы, вероятно, хотите установить SqlParameter.SqlValue, который является значением с использованием типов SQL согласно документам. SqlParameter.Value, с другой стороны, является значением с использованием типов CLR и позволяет выводить как DbType, так и SqlValue. Sidenote, подробности реализации: Установщик SqlParameter.SqlValue просто вызывает установщик SqlParameter.Value снова ...

Я ожидаю, что ADO.NET преобразует значение самостоятельно, если это вообще возможно. Какую ошибку вы получаете, не перепрыгивая через эти обручи?

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