如果为null则如何返回0然后导入到datagridview

时间:2013-04-17 04:14:50

标签: c# sql sql-server datagridview

我有一个像这样的SQL数据

1 2m
2 3m
3 3m
6 6m
7 6m

我想导出并将其显示到datagridview中。

1 2m
2 3m
3 3m
4 0m
5 0m
6 6m
7 6m

这是我的代码:

private void laygio(string tenstore, string tenxuat)
{
    string conn = "Data Source=USER-PC;Initial Catalog=NCKHmoi;Integrated Security=True";
    SqlConnection connect = new SqlConnection(conn);
    SqlCommand command = new SqlCommand();
    command.Connection = connect;
    connect.Open();
    int stday = Convert.ToInt32(dst.Text);
    int stmonth = Convert.ToInt32(mst.Text);
    int styear = Convert.ToInt32(yst.Text);
    int sthour = Convert.ToInt32(hst.Text);
    int stminute = 0;
    int stsecond = 0;
    int eday = Convert.ToInt32(ded.Text);
    int emonth = Convert.ToInt32(med.Text);
    int eyear = Convert.ToInt32(yed.Text);
    int ehour = Convert.ToInt32(hed.Text);
    int eminute = 0;
    int esecond = 0;
    DateTime startday = new DateTime(styear, stmonth, stday, sthour, stminute, stsecond);
    DateTime endday = new DateTime(eyear, emonth, eday, ehour, eminute, esecond);
    DataTable tbl = new DataTable();
    DataColumn Col = new DataColumn("Thời gian", typeof(int));
    tbl.Columns.Add(Col);
    SqlDataAdapter adapter = new SqlDataAdapter();
    int i = 1;
    for (DateTime xday = startday; xday <= endday; xday += TimeSpan.FromHours(1))
    {
        int ngay = Convert.ToInt32(xday.Day.ToString());
        int thang = Convert.ToInt32(xday.Month.ToString());
        int nam = Convert.ToInt32(xday.Year.ToString());
        int gio = Convert.ToInt32(xday.Hour.ToString());
        command.CommandType = CommandType.Text;
        command.CommandText = @"Select SoLieuGio.LLNuoc from SoLieuGio where SoLieuGio.GioID= (select Gio.GioID from Gio where (Gio.Gio = @Gio and Gio.NgayID= (select Ngay.NgayID from Ngay where (Ngay.Ngay=@Ngay and Ngay.ThangID= (select Thang.ThangID from Thang where (Thang.Thang = @Thang and Thang.NamID=(select Nam.NamID from Nam where  (Nam.Nam = @Nam and Nam.TramID=(select Tram.TramID from Tram Where (Tram.TenTram like @TenTram and Tram.TinhID=(select Tinh.TinhID from Tinh where  (Tinh.TenTinh like @TenTinh and Tinh.KhuVucID=(select KhuVuc.KhuVucID from KhuVuc where KhuVuc.Ten=@Ten)))))))))))))";
        command.Parameters.Add("@Gio", SqlDbType.BigInt).Value = gio;
        command.Parameters.Add("@Ngay", SqlDbType.BigInt).Value = ngay;
        command.Parameters.Add("@Thang", SqlDbType.BigInt).Value = thang;
        command.Parameters.Add("@Nam", SqlDbType.BigInt).Value = nam;
        command.Parameters.Add("@Ten", SqlDbType.NVarChar, 50).Value = "Đồng Bằng Bắc Bộ";
        command.Parameters.Add("@TenTinh", SqlDbType.NVarChar, 50).Value = TinhComboBoxEx.Text;
        command.Parameters.Add("@TenTram", SqlDbType.NVarChar, 50).Value = TramComboBoxEx.Text;
        adapter.SelectCommand = command;
        adapter.Fill(tbl);
        dataGridView2.DataSource = tbl;            
        command.Parameters.Clear();
    }
    command.Dispose();
    connect.Close();
}

该代码的结果是:

1 2米 2 3米 3 3米 6 6米 7 6米

我需要确定从1到7完全显示它。

3 个答案:

答案 0 :(得分:2)

您可以使用计数表master..spt_values来处理系列中缺少的项目。

您可以左键加入表格并合并您的值。

例如

CREATE TABLE ATable
    ([Number] int, [value] varchar(2))
;

INSERT INTO ATable
    ([Number], [value])
VALUES
    (1, '2m'),
    (2, '3m'),
    (3, '3m'),
    (6, '6m'),
    (7, '6m')
;

这个

SELECT
  v.Number,
  COALESCE(ATable.Value, '0m') Value
FROM
  master..spt_values  v
  LEFT JOIN ATable
  ON v.Number = ATable.Number
WHERE
  v.Type = 'P'
  and v.Number > 0 and v.Number < 8

会产生这个值

| NUMBER | VALUE |
------------------
|      1 |    2m |
|      2 |    3m |
|      3 |    3m |
|      4 |    0m |
|      5 |    0m |
|      6 |    6m |
|      7 |    6m |

DEMO

答案 1 :(得分:0)

在这种情况下最容易做的事情我想是每次检查当前值是否是前一个值的总和+ 1

if (current != (previous + 1)
{
    //make new 4 0m or something
}
else
{
    //continue reading
}

答案 2 :(得分:0)

尝试创建一个包含缺失值的临时表,然后加入主表和临时表。

这就是它的样子

create table #temp1
(
    ID int identity(1,1),
    M varchar(4)
)
declare @count int
SET @count = 0

declare @max int
SET @max = 20

while @count < @max
begin
insert into #temp1 (M) values ('0m') 
SET @count = @count + 1
end

select * from #temp1

select (case M1.ID when null then T1.ID else M1.ID) as ID,
(case M1.M when null then T1.M else M1.ID) as TXT
from MainTable M1
join #temp1 T1
order by ID