|
9 | 9 |
|
10 | 10 | A Roslyn-based analyzer for SQL related stuff in .NET |
11 | 11 |
|
12 | | - |
13 | 12 | ## Analyzers |
14 | 13 |
|
15 | | -### SQL001 |
16 | | -**SQL type is not specified** |
17 | | - |
18 | | -Noncompliant Code Example: |
19 | | -```csharp |
20 | | -Query<Thing>("select * from Thing where Name = @Name", new { Name = abcde }); |
21 | | -``` |
22 | | - |
23 | | -Compliant Solution: |
24 | | -```csharp |
25 | | -Query<Thing>("select * from Thing where Name = @Name", new {Name = new DbString { Value = "abcde", IsFixedLength = true, Length = 10, IsAnsi = true }}); |
26 | | -``` |
27 | | - |
28 | | -https://github.com/StackExchange/Dapper/blob/master/Readme.md#ansi-strings-and-varchar |
29 | | - |
30 | | - |
31 | | -### SQL002 |
32 | | -**SQL parameters mismatch** |
33 | | - |
34 | | -Noncompliant Code Example: |
35 | | -Dapper |
36 | | -```csharp |
37 | | -var dog = connection.Query<Dog>("select Age = @Age, Id = @Id", new { Id = guid }); |
38 | | -``` |
39 | | - |
40 | | -SqlCommand |
41 | | -```csharp |
42 | | -var sql = new SqlCommand("select Age = @Age, Id = @Id"); |
43 | | -sql.Parameters.AddWithValue("@Id", guid); |
44 | | -sql.ExecuteNonQuery(); |
45 | | -``` |
46 | | - |
47 | | -Compliant Solution: |
48 | | -Dapper |
49 | | -```csharp |
50 | | -var dog = connection.Query<Dog>("select Age = @Age, Id = @Id", new { Age = (int?)null, Id = guid }); |
51 | | -``` |
52 | | - |
53 | | -SqlCommand |
54 | | -```csharp |
55 | | -var sql = new SqlCommand("select Age = @Age, Id = @Id"); |
56 | | -sql.Parameters.AddWithValue("@Id", guid); |
57 | | -sql.Parameters.AddWithValue("@Age", 42); |
58 | | -sql.ExecuteNonQuery(); |
59 | | -``` |
60 | | - |
61 | | -### SQL003 |
62 | | -**Using 'Query' method is not optimal here** |
63 | | - |
64 | | -Noncompliant Code Example: |
65 | | -```csharp |
66 | | -var dog = connection.Query<Dog>("select * from dogs").Single(); |
67 | | -``` |
68 | | - |
69 | | -Compliant Solution: |
70 | | -```csharp |
71 | | -var dog = connection.QuerySingle<Dog>("select * from dogs"); |
72 | | -``` |
73 | | - |
74 | | -https://github.com/StackExchange/Dapper#performance |
75 | | - |
76 | | -### SQL004 |
77 | | -**Using 'QueryMultiple' method is not optimal here** |
78 | | - |
79 | | -Noncompliant Code Example: |
80 | | -```csharp |
81 | | -var multi = connection.QueryMultiple("select * from dogs"); |
82 | | -var dogs = multi.Read<Dog>(); |
83 | | -``` |
84 | | - |
85 | | -Compliant Solution: |
86 | | -```csharp |
87 | | -var dogs = connection.Query<Dog>("select * from dogs"); |
88 | | -``` |
89 | | - |
90 | | -### SQL005 |
91 | | - |
92 | | -**Using 'SaveChanges' method in a loop can affect performance** |
93 | | - |
94 | | -Noncompliant Code Example: |
95 | | -```csharp |
96 | | -var dbContext = new DbContext("test"); |
97 | | -for (int i = 0; i < 100; i++) |
98 | | -{ |
99 | | - dbContext.Entities.Add(new Entity(i)); |
100 | | - s.SaveChanges(); |
101 | | -} |
102 | | -``` |
103 | | - |
104 | | -Compliant Solution: |
105 | | -```csharp |
106 | | -var dbContext = new DbContext("test"); |
107 | | -for (int i = 0; i < 100; i++) |
108 | | -{ |
109 | | - dbContext.Entities.Add(new Entity(i)); |
110 | | -} |
111 | | - |
112 | | -s.SaveChanges(); |
113 | | -``` |
| 14 | +| Rule\Library | Dapper | ADO.NET | Entity Framework | |
| 15 | +|----------------------------------------------------------------------------------------|:------------------:|:------------------:|:------------------:| |
| 16 | +| [SQL001: SQL type is not specified](rules/SQL001.md) | :heavy_check_mark: | | | |
| 17 | +| [SQL002: SQL parameters mismatch](rules/SQL002.md) | :heavy_check_mark: | :heavy_check_mark: | | |
| 18 | +| [SQL003: Using 'Query' method is not optimal here](rules/SQL003.md) | :heavy_check_mark: | | | |
| 19 | +| [SQL004: Using 'QueryMultiple' method is not optimal here](rules/SQL004.md) | :heavy_check_mark: | | | |
| 20 | +| [SQL005: Using 'SaveChanges' method in a loop can affect performance](rules/SQL005.md) | | | :heavy_check_mark: | |
0 commit comments