Как эффективно выполнять запросы к базе данных, добавлять строки при необходимости и получать результаты - PullRequest
1 голос
/ 03 мая 2011

Я использую SQL Server Compact в своем проекте на C #. В моей базе данных есть таблица Users, которая имеет два столбца - столбец идентификатора (PRIMARY KEY) и столбец имени пользователя. Я отслеживаю различных пользователей, которые взаимодействуют с моей системой, вставляя их имя пользователя в таблицу Users.

Когда пользователь связывается с системой, я хочу записать его имя в таблицу, если его там еще нет. Очевидно, я мог бы добавить ключевое слово UNIQUE в столбец «Имя пользователя», но это означает, что мне нужно обрабатывать исключения для повторяющихся попыток ввода. Как только имя окажется в таблице - либо потому, что оно уже существует, либо мне пришлось добавить его - мне нужно получить соответствующий идентификатор.

Вот рабочий код для стрельбы.

public void GetUserId(string username)
{
    using (SqlCeCommand selcmd= new SqlCeCommand(
        "SELECT * FROM users WHERE username = @user", conn))
    {
        selcmd.Parameters.AddWithValue("@user", username);
        SqlCeResultSet rs = selcmd.ExecuteResultSet(ResultSetOptions.Scrollable);
        if (!rs.HasRows)
        {
            using (SqlCeCommand inscmd= new SqlCeCommand(
                "INSERT INTO users (username) values (@user)", conn))
            {
                inscmd.Parameters.AddWithValue("@user", username);
                inscmd.ExecuteNonQuery();
            }

            rs = selcmd.ExecuteResultSet(ResultSetOptions.Scrollable);
        }

        rs.ReadFirst();

        return (rs.GetInt32(rs.GetOrdinal("id")));
    }
}

Есть ли способ сделать это более эффективно?

Ответы [ 2 ]

1 голос
/ 04 мая 2011

Ваше решение является лучшим подходом для SQL Server Compact - в других предлагаемых решениях используется синтаксис, недоступный в SQL Server Compact

0 голосов
/ 03 мая 2011

Вы могли бы сделать это:

INSERT IF NOT EXISTS INTO `tablename` yadda yadda yadda

это не вызовет исключения.

Кстати, это вопрос SQL, а не c # или .net

...