Я пытаюсь получить строку из базы данных MS Access и вставить ее в базу данных SQL Server с помощью набора данных. Но строка utf8 в моем операторе SQL вставлена как ????????? - что я могу об этом?

Это мой код:

OleDbCommand cmd2 = new OleDbCommand("select * from t_about_us", con_access);
OleDbDataAdapter da2 = new OleDbDataAdapter(cmd2);

DataSet ds2 = new DataSet();
da2.Fill(ds2, "t_about_us");

con.Open();
string command2 = "insert into t_about_us(matn,see,metatag_description,metatag_keywords,metatag_author) values('" +
          Encoding.UTF8.GetString(Encoding.UTF8.GetBytes(ds2.Tables[0].Rows[0]["matn"].ToString())) + "','" +
           Convert.ToInt32(ds2.Tables[0].Rows[0]["see"].ToString()) + "','" +
           ds2.Tables[0].Rows[0]["metatag_description"].ToString() + "','" +
           ds2.Tables[0].Rows[0]["metatag_keywords"].ToString() + "','" +
           ds2.Tables[0].Rows[0]["metatag_author"].ToString() + "')";

SqlCommand cmdd2 = new SqlCommand(command2, con);
cmdd2.ExecuteNonQuery();
con.Close();
0
user3696331 27 Ноя 2016 в 17:37

2 ответа

Лучший ответ

Используя динамический SQL для создания оператора SQL с литералами типа 'this', вы неявно конвертируете строку из Unicode в однобайтовый набор символов, используемый SQL Server, и любые символы Unicode которые не соответствуют этому целевому набору символов, будут заменены вопросительными знаками.

Так, например, с моим SQL Server ...

cmd.CommandText = "INSERT INTO myTable (textCol) VALUES ('γιορτή')";
cmd.ExecuteNonQuery();

... будет вставлен как ...

????t?

... даже если [textCol] определен как столбец NVARCHAR.

Правильный подход - использовать параметризованный запрос , например

cmd.CommandText = "INSERT INTO myTable (textCol) VALUES (@word)";
cmd.Parameters.Add("@word", System.Data.SqlDbType.NVarChar).Value = "γιορτή";
cmd.ExecuteNonQuery();
0
Gord Thompson 27 Ноя 2016 в 16:23

Спасибо друзья мои Наконец-то мой код заработал, вот ответ:

OleDbCommand cmd2 = new OleDbCommand("select * from t_about_us", con_access);
        OleDbDataAdapter da2 = new OleDbDataAdapter(cmd2);
        DataSet ds2 = new DataSet();
        da2.Fill(ds2, "t_about_us");

        con.Open();
        SqlCommand cmd1 = new SqlCommand("INSERT INTO t_about_us(matn,see,metatag_description,metatag_keywords,metatag_author) VALUES (@matn,@see,@metatag_description,@metatag_keywords,@metatag_author)",con);
        cmd1.Parameters.Add("@see", System.Data.SqlDbType.BigInt).Value = Convert.ToInt32(ds2.Tables[0].Rows[0]["see"].ToString());
        cmd1.Parameters.Add("@matn", System.Data.SqlDbType.NVarChar).Value = ds2.Tables[0].Rows[0]["matn"].ToString();
        cmd1.Parameters.Add("@metatag_description", System.Data.SqlDbType.NVarChar).Value = ds2.Tables[0].Rows[0]["metatag_description"].ToString();
        cmd1.Parameters.Add("@metatag_keywords", System.Data.SqlDbType.NVarChar).Value = ds2.Tables[0].Rows[0]["metatag_keywords"].ToString();
        cmd1.Parameters.Add("@metatag_author", System.Data.SqlDbType.NVarChar).Value = ds2.Tables[0].Rows[0]["metatag_author"].ToString();
        cmd1.ExecuteNonQuery();
        con.Close();
0
user3696331 1 Дек 2016 в 18:21