Как вставить несколько значений списка флажков в базу данных в одном столбце с помощью C # - PullRequest
1 голос
/ 04 августа 2010

я использую это, чтобы установить один флажок для выбранного столбца как я могу преобразовать это в несколько флажков в один столбец Я использую много способов более 3 дней без успеха

 private void BindCheckBoxList()
    {
        DataTable dt = new DataTable();
        SqlConnection connection = new SqlConnection(GetConnectionString());
        try
        {
            connection.Open();
            string sqlStatement = "SELECT * FROM boby";
            SqlCommand sqlCmd = new SqlCommand(sqlStatement, connection);
            SqlDataAdapter sqlDa = new SqlDataAdapter(sqlCmd);

            sqlDa.Fill(dt);
            if (dt.Rows.Count > 0)
            {
                CheckBoxList1.RepeatColumns = 4; // set the number of columns in the CheckBoxList
                CheckBoxList1.DataSource = dt;
                CheckBoxList1.DataTextField = "Name"; // the items to be displayed in the list items
                CheckBoxList1.DataValueField = "Name"; // the id of the items displayed
                CheckBoxList1.DataBind();

                //Setting the Selected Items in the ChecBoxList based from the value in the database
                //to do this, lets iterate to each items in the list
                for (int i = 0; i < dt.Rows.Count; i++)
                {
                    if (!string.IsNullOrEmpty(dt.Rows[i]["IsSelected"].ToString()))
                    {
                        CheckBoxList1.Items[i].Selected = Convert.ToBoolean(dt.Rows[i]["IsSelected"]);
                    }
                }
            }

        }
        catch (System.Data.SqlClient.SqlException ex)
        {
            string msg = "Fetch Error:";
            msg += ex.Message;
            throw new Exception(msg);
        }
        finally
        { 
            connection.Close();
        }
    }

    private void Update(string name, bool isSelected)
    {
        SqlConnection connection = new SqlConnection(GetConnectionString());
        SqlCommand cmd;
        string sqlStatement = string.Empty;
        try
        {
            connection.Open();
            sqlStatement = "UPDATE handymen SET IsSelected = @IsSelected WHERE Name = @BizName";
            cmd = new SqlCommand(sqlStatement, connection);
            cmd.Parameters.AddWithValue("@Name", name);
            cmd.Parameters.AddWithValue("@IsSelected", isSelected);
            cmd.CommandType = CommandType.Text;
            cmd.ExecuteNonQuery();
        }
        catch (System.Data.SqlClient.SqlException ex)
        {
            string msg = "Insert/Update error";
            msg += ex.Message;
            throw new Exception(msg);

        }
        finally
        {
            connection.Close();
        }
    }

    protected void Page_Load(object sender, EventArgs e)
    {
        if (!Page.IsPostBack)
        {
            BindCheckBoxList();
        }
    }
    protected void Button1_Click(object sender, EventArgs e)
    {
        string str = string.Empty;

        for (int i = 0; i < CheckBoxList1.Items.Count; i++)
        {
            if (CheckBoxList1.Items[i].Selected)
            {
                str = CheckBoxList1.Items[i].Text;
                Update(str, CheckBoxList1.Items[i].Selected);
            }
        }
        //ReBind the List to retain the selected items on postbacks

        BindCheckBoxList();
    }

Ответы [ 4 ]

2 голосов
/ 04 августа 2010

Что ж, если вы собираетесь это сделать, лучшим способом было бы объединить их в побитовую композицию, возможно, так:

int value = 0;      //or short or long, depending on the number of bits
int bitDegree = 1;  //or short or long, depending on the number of bits

for (int i = 0; i < dt.Rows.Count; i++)
{
    if (!string.IsNullOrEmpty(dt.Rows[i]["IsSelected"].ToString())
        && Convert.ToBoolean(dt.Rows[i]["IsSelected"]))
    {
        value += bitDegree;
    }

    bitDegree *= 2;
}

Однако, если вы можете, лучше использовать несколько битовых столбцов в вашей базе данных, а не объединять их.

1 голос
/ 04 августа 2010

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

Если бы вы имели , хотя бы могли конвертировать их в целые и отделить их с помощьюзапятая?

например.1,0,0,1,1 и т. Д.

0 голосов
/ 28 марта 2013

Попробуйте это

protected void Button1_Click(object sender, EventArgs e)
{
    SqlConnection con = new SqlConnection("Data Source=ANSA-PC\\SQLEXPRESS;Initial Catalog=pms;Integrated Security=True");
    String str = "";

    for (int i = 0; i <=CheckBoxList1.Items.Count-1; i++)
    {

        if (CheckBoxList1.Items[i].Selected)
        {

            if (str == "")
            {
                str = CheckBoxList1.Items[i].Text;
            }
            else
            {
                str += "," + CheckBoxList1.Items[i].Text;

            }

        }
    }
    con.Open();
    SqlCommand cmd = new SqlCommand("insert into aa(a)values('" +str + "')", con);
    cmd.ExecuteNonQuery();
    ClientScript.RegisterStartupScript(Page.GetType(), "validation", "<script language='javascript'>alert('ansari:u also got it')</script>");
}
0 голосов
/ 04 августа 2010

Рассматривали ли вы использование битовой маски ?Ниже приведено объяснение с использованием выбранных категорий в качестве примера (не уверен, что категории будут работать в вашей ситуации, но оно иллюстрирует концепцию):

Начните с присвоения одной двоичной цифры каждому значению -

cat1  cat2  cat3 cat4
----  ----  ---- ----
1     2     4    8

Далее вы добавите целочисленный столбец в основную таблицу, мы назовем его options.Когда число преобразуется в двоичное, каждая цифра будет отображать, установлены ли категории 1, 2, 3 или 4.Пример:

5 = 0101 в двоичном формате = cat1 установлен, cat2 не установлен, cat3 установлен, cat4 не установлен

id | name         | options
---------------------------
1  | name1        | 5
2  | name2        | 2
3  | name3        | 7
4  | name4        | 6

Теперь мы можем использовать побитовые операции со столбцом параметровопределить, какие варианты разрешены.Примеры:

Чтобы получить все записи, для которых установлена ​​категория 2, когда мы не заботимся о других категориях, выполните следующую операцию:

2 & options = 2

Это вернет записи 2,3 и 4.


Чтобы получить все записи, для которых установлены cat2 и cat3, мы выполним следующую побитовую операцию:

6 & options = 6

Это вернет записи 3 и 4


Чтобы получить все записи, для которых установлены категории 1 и 3, мы выполним следующую побитовую операцию:

5 & options = 5

При этом будут возвращены записи 1 и 3.


Установлена ​​ТОЛЬКО категория 3:

4 |Опции = 4


Категория 3 НЕ установлена:

4 & опции = 0


Вероятно, это сложная концепция для понимания, поэтому, пожалуйста, дайте мне знатьесли у вас есть какие-нибудь вопросы.Мне кажется, что это может быть самый простой способ выполнить то, что вы пытаетесь сделать, как только вы сможете понять концепцию.

...